按计数和总计数分组
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 = 3
或 4
,基于输入。
另外,我怎样才能得到产品代码的数量。
对于 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 字段。
我想弄清楚如何通过查询获得以下结果但无法做到这一点。
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 = 3
或 4
,基于输入。
另外,我怎样才能得到产品代码的数量。
对于 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 字段。