我试图弄清楚如何通过查询得到以下结果,但无法做同样的事情。
表名:ProductMaster
ProductCode Quantity EntryDate
A1 10 10/03/2015
A1 10 15/03/2015
A2 10 18/03/2015
A2 10 25/03/2015
A1 10 10/04/2015
A2 10 15/04/2015
我想得到结果 如果我选择三月份,结果应为:
ProductCode MonthCount TotalCount
A1 20 30
A2 20 30
如果我选择4月份,结果应为:
ProductCode MonthCount TotalCount
A1 10 30
A2 10 30
我的查询:
SELECT ProductCode, SUM(Quantity)
FROM ProductMaster
WHERE DATEPART(MONTH, EntryDate) = @Month
GROUP BY ProductCode
基于输入的@month = 3
或4
。
此外,我如何获得产品代码的数量。
对于Month = 3
ProductCode MonthCount TotalCount
A1 2 3
A2 2 3
答案 0 :(得分:5)
您可以使用基于case
的{{1}}表达式:
@Month
编辑:
要回答已修改的问题,您可以使用SELECT ProductCode,
SUM (CASE WHEN MONTH(EntryDate) = @Month THEN Quantity ELSE 0 END)
AS MonthCount,
SUM (Quantity) AS TotalConount
FROM ProductMaster
GROUP BY ProductCode
代替count
的相同技巧:
sum
答案 1 :(得分:2)
这是使用Common Table Expression(CTE)的解决方案。此查询将获取同一结果集中所有月份的结果。如果你只需要一个月就可以添加一个WHERE子句并在MonthNumber上过滤你想要的月份。
;WITH cteProductMasterByMonth AS
(
SELECT ProductCode, DATEPART(MONTH, EntryDate) as MonthNumber, SUM(Quantity) as MonthCount
FROM #ProductMaster
GROUP BY ProductCode, DATEPART(MONTH, EntryDate)
)
SELECT ProductCode, MonthCount, SUM(MonthCount) OVER(PARTITION BY ProductCode) AS TotalCount
FROM cteProductMasterByMonth
ORDER BY MonthNumber, ProductCode
上对此进行了测试
注意:如果EntryDate值跨越多年,并且您希望得到每个月 - 年对的结果,那么您需要在CTE查询中添加一个附加条件,以便按DATEPART(YEAR, EntryDate)
进行分组。可能是一个YearNumber字段,类似于select子句中的MonthNumber字段。