按计数和总计数分组

Group By Count and Total Count

我想弄清楚如何通过查询获得以下结果但无法做到这一点。

Table 姓名: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

我想得到结果 如果我 select 三月份,结果应该是:

ProductCode   MonthCount   TotalCount
A1            20           30         
A2            20           30

如果我 select 四月份,结果应该是:

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

您可以使用基于 @Month:

case 表达式
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:

的相同技术
SELECT   ProductCode, 
         COUNT (CASE WHEN MONTH(EntryDate) = @Month THEN Quantity ELSE NULL END) 
           AS MonthCount,
         COUNT (*) AS TotalConount
FROM     ProductMaster
GROUP BY ProductCode

这是一个使用 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 字段。