2015-04-22 55 views
2

我想弄清楚如何通过查询得到以下结果,但无法做到这一点。按组数和总数

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

我想结果为 如果我选择3月份当月,结果应为:

ProductCode MonthCount TotalCount 
A1   20   30   
A2   20   30 

如果我选择月一个月,结果应为:

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 
+0

不应该在你的第一个例子总数为40?你的第二个例子是20? – paqogomez

+0

总数也按产品代码分组。因此,如果您检查A1的总计数是30. –

+0

EntryDate列是DateTime吗?您尝试过哪些查询以获得期望的结果? –

回答

5

你可以使用基于@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 
+0

好的。我很接近,但只能想出实现相同的目标。对我很有帮助。 Thankssss。 –

2

她e是使用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)以及可能是与Select子句中的MonthNumber字段类似的YearNumber字段。