2015-04-22 58 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字段。