按计数和总计数分组

时间:2015-04-22 15:59:51

标签: sql sql-server-2008 select group-by

我试图弄清楚如何通过查询得到以下结果,但无法做同样的事情。

表名: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 = 34

此外,我如何获得产品代码的数量。 对于Month = 3

ProductCode   MonthCount   TotalCount
A1            2            3         
A2            2            3

2 个答案:

答案 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

我在SqlFiddle

上对此进行了测试

注意:如果EntryDate值跨越多年,并且您希望得到每个月 - 年对的结果,那么您需要在CTE查询中添加一个附加条件,以便按DATEPART(YEAR, EntryDate)进行分组。可能是一个YearNumber字段,类似于select子句中的MonthNumber字段。