Counting Items based on First Month Sold

浪尽此生 提交于 2019-12-11 05:03:36

问题


I have a list of orders, along with a list of items that were sold in each order.

However, I only want to count items sold during the first month the items were for sale. This would typically be figured out by looking at the minimum date in which an item appeared.

Below is some sample code

    DECLARE @sales table(
    itemnumber int,
    saledate date,
    ordid int)

    INSERT INTO @sales VALUES(43029, '2011-26-03', 1)
    INSERT INTO @sales VALUES(43029, '2011-26-03', 2)
    INSERT INTO @sales VALUES(43029, '2011-26-03', 3)
    INSERT INTO @sales VALUES(43029, '2011-26-03', 4)
    INSERT INTO @sales VALUES(43029, '2011-26-03', 4)
    INSERT INTO @sales VALUES(43029, '2011-26-04', 4)
    INSERT INTO @sales VALUES(43029, '2011-26-04', 5)
    INSERT INTO @sales VALUES(43029, '2011-26-04', 5)
    INSERT INTO @sales VALUES(43030, '2011-26-04', 5)
    INSERT INTO @sales VALUES(43030, '2011-26-04', 6)
    INSERT INTO @sales VALUES(43030, '2011-26-04', 7)
    INSERT INTO @sales VALUES(43030, '2011-26-04', 8)
    INSERT INTO @sales VALUES(43030, '2011-26-04', 8)
    INSERT INTO @sales VALUES(43030, '2011-26-04', 8)
    INSERT INTO @sales VALUES(43030, '2011-26-05', 9)
    INSERT INTO @sales VALUES(43030, '2011-26-05', 9)
    INSERT INTO @sales VALUES(43030, '2011-26-05', 9)
    INSERT INTO @sales VALUES(43030, '2011-26-05', 9)
    INSERT INTO @sales VALUES(43030, '2011-26-05', 9)
    INSERT INTO @sales VALUES(43030, '2011-26-05', 9)
    INSERT INTO @sales VALUES(43030, '2011-26-05', 19)
    INSERT INTO @sales VALUES(43030, '2011-26-05', 19)
    INSERT INTO @sales VALUES(43030, '2011-26-05', 25)
    INSERT INTO @sales VALUES(43030, '2011-26-05', 25)
    INSERT INTO @sales VALUES(43030, '2011-26-05', 25)
    INSERT INTO @sales VALUES(43030, '2011-26-05', 27)
    INSERT INTO @sales VALUES(43030, '2011-26-05', 27)
    INSERT INTO @sales VALUES(43030, '2011-26-05', 27)
    INSERT INTO @sales VALUES(43050, '2011-26-05', 28)
    INSERT INTO @sales VALUES(43050, '2011-26-05', 29)
    INSERT INTO @sales VALUES(43050, '2011-26-05', 39)
    INSERT INTO @sales VALUES(43050, '2011-26-05', 30)
    INSERT INTO @sales VALUES(43050, '2011-26-06', 31)
    INSERT INTO @sales VALUES(43050, '2011-26-06', 31)
    INSERT INTO @sales VALUES(43090, '2011-26-07', 61)
    INSERT INTO @sales VALUES(43090, '2011-26-07', 61)
    INSERT INTO @sales VALUES(43090, '2011-26-07', 61)
    INSERT INTO @sales VALUES(43090, '2011-26-07', 61)
    INSERT INTO @sales VALUES(43090, '2011-26-08', 71)
    INSERT INTO @sales VALUES(43090, '2011-26-08', 71)

The output would look like the table below, only counting orders from first months worth of sales for that item

ItemNo | MonthYear | Count
-------------------------
43029  | 03-2011   | 5
43030  | 04-2011   | 6
43050  | 05-2011   | 4
43090  | 07-2011   | 4

I'm able to get total counts by ITEM NO along with showing the first ord date, and count the number of items sold on the day itself, but am not able to count all items for the month/year in aggregate, as the item may be sold over multiple orders/dates in the same month

Any help would be great!


回答1:


Try this

DECLARE @sales table(
itemnumber int,
saledate date,
saleid int)

INSERT INTO @sales VALUES(1234, '2015-01-10', 1)
INSERT INTO @sales VALUES(1234, '2015-01-11', 2)
INSERT INTO @sales VALUES(1234, '2015-01-12', 3)
INSERT INTO @sales VALUES(1234, '2015-01-13', 4)
INSERT INTO @sales VALUES(1234, '2015-01-14', 5)
INSERT INTO @sales VALUES(1234, '2015-02-10', 6)
INSERT INTO @sales VALUES(1234, '2015-02-11', 7)
INSERT INTO @sales VALUES(1234, '2015-03-10', 8)
INSERT INTO @sales VALUES(1234, '2015-04-10', 9)
INSERT INTO @sales VALUES(1234, '2015-04-16', 10)
INSERT INTO @sales VALUES(1256, '2015-02-10', 11)
INSERT INTO @sales VALUES(1256, '2015-02-11', 12)
INSERT INTO @sales VALUES(1256, '2015-02-12', 13)
INSERT INTO @sales VALUES(1256, '2015-02-13', 14)
INSERT INTO @sales VALUES(1256, '2015-02-14', 15)
INSERT INTO @sales VALUES(1256, '2015-03-10', 16)
INSERT INTO @sales VALUES(1256, '2015-03-11', 17)
INSERT INTO @sales VALUES(1256, '2015-04-10', 18)
INSERT INTO @sales VALUES(1256, '2015-04-10', 19)
INSERT INTO @sales VALUES(1256, '2015-04-16', 20)
INSERT INTO @sales VALUES(1259, '2015-02-10', 21)
INSERT INTO @sales VALUES(1259, '2015-02-11', 22)
INSERT INTO @sales VALUES(1259, '2015-03-12', 23)
INSERT INTO @sales VALUES(1259, '2015-03-13', 24)
INSERT INTO @sales VALUES(1259, '2015-03-14', 25)
INSERT INTO @sales VALUES(1259, '2015-03-10', 26)
INSERT INTO @sales VALUES(1259, '2015-03-11', 27)
INSERT INTO @sales VALUES(1259, '2015-04-10', 28)
INSERT INTO @sales VALUES(1259, '2015-04-10', 29)
INSERT INTO @sales VALUES(1259, '2015-04-16', 30)
INSERT INTO @sales VALUES(1255, '2015-03-10', 31)
INSERT INTO @sales VALUES(1255, '2015-03-11', 32)
INSERT INTO @sales VALUES(1255, '2015-03-12', 33)
INSERT INTO @sales VALUES(1255, '2015-03-13', 34)
INSERT INTO @sales VALUES(1255, '2015-03-14', 35)
INSERT INTO @sales VALUES(1255, '2015-03-10', 36)
INSERT INTO @sales VALUES(1255, '2015-03-11', 37)
INSERT INTO @sales VALUES(1255, '2015-03-10', 38)
INSERT INTO @sales VALUES(1255, '2015-04-10', 39)
INSERT INTO @sales VALUES(1255, '2015-04-16', 40)

SELECT s.itemnumber, 
right(convert(varchar, fd.firstsaledate, 103), 7) AS firstsale, 
COUNT(*) as firstmonthsales FROM @sales s
INNER JOIN 
(SELECT itemnumber, Min(saledate) as firstsaledate FROM @sales 
GROUP BY itemnumber) as fd
ON MONTH(s.saledate) = MONTH(fd.firstsaledate) 
AND YEAR(s.saledate) = YEAR(fd.firstsaledate)
AND s.itemnumber = fd.itemnumber
GROUP BY s.itemnumber, fd.firstsaledate

Results

itemnumber  firstsale   firstmonthsales
1234        01/2015     5
1255        03/2015     8
1256        02/2015     5
1259        02/2015     2



回答2:


Using sample data from Jonathan Willcock..

Since you are on 2012,you can use window functions as well like below..

;With cte
as
(select 
itemnumber,saledate,dense_rank() over (partition by  itemnumber order by cast(month(saledate) as varchar(2))+'/'+cast(year(saledate) as varchar(4)) ) as rownum
from
@sales
)
select itemnumber,cast(month(saledate) as varchar(2))+'/'+cast(year(saledate) as varchar(4)),sum(rownum) as salescount

from cte
where rownum=1
group by
itemnumber,cast(month(saledate) as varchar(2))+'/'+cast(year(saledate) as varchar(4))


来源:https://stackoverflow.com/questions/39067500/counting-items-based-on-first-month-sold

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!