2011-05-23 32 views
0

我有類似以下的查詢:我總不受ROLLUP

SELECT CASE WHEN (GROUPING(Name) = 1) THEN 'All' ELSE Name END AS Name, 
     CASE WHEN (GROUPING(Type) = 1) THEN 'All' ELSE Type END AS Type, 
     sum(quantity) AS [Quantity], 
     CAST(sum(quantity) * (SELECT QuantityMultiplier FROM QuantityMultipliers WHERE a = t.b) AS DECIMAL(18,2)) AS Multiplied Quantity 
FROM @Table t 
GROUP BY Name, Type WITH ROLLUP 

我試圖返回名稱,類型求和數量和總結數量乘以一個任意名單數。迄今爲止都很好。我還需要爲每個名稱和每種類型返回一個小計行,如下所示:

Name  Type  Quantity  Multiplied Quantity 
-------  --------- -----------  ------------------- 
a   1   2    4 
a   2   3    3 
a   ALL   5    7 
b   1   6    12 
b   2   1    1 
b   ALL   7    13 
ALL   ALL   24    40 

前3列都很好。儘管我在累計數量的彙總行中獲得了空值。我認爲這種情況發生的唯一原因是因爲SQL現在不會將最後一列識別爲聚合,現在我已經將它乘以某些東西。

我可以以某種方式解決這個問題,而不會讓事情變得過於複雜嗎?

如果無法完成,我將重新回到臨時表格。

+0

我想,'t.b'要麼在GROUP BY中提及或聚合函數中。 – 2011-05-23 19:22:38

回答

1

在獲取乘數的子查詢中,您有WHERE a=b。從主查詢中的表中找到a還是b

如果這些值是靜態的(無關,與主查詢),它看起來像它應該是罰款......

如果ab值是nametype場,他們可以NULL爲彙總記錄。如果是這樣,你可以改變類似的東西...

CAST(sum(quantity * (<multiplie_query>)) AS DECIMAL(18,2))


如果ab其他領域從你的主查詢,你會越來越多條記錄回來,不只是一個單一的乘數。你可以更改爲類似...

CAST(sum(quantity) * (SELECT MAX(multiplier) FROM ...)) AS DECIMAL(18,2))

+0

感謝您的回答,子查詢確實依賴主查詢中的一個字段,應該更清楚。我會嘗試你所說的。 – Ciaran 2011-05-23 15:55:34

+0

不幸的是,使用'Multiplier'上的'MAX'運行累積記錄仍然在該列中產生空值。 – Ciaran 2011-05-23 16:10:56

+0

我現在離家了,但作爲一個調試練習,我建議把每個獨立的組件作爲一個單獨的領域輸出。基本上,看看不同的乘數查詢自己給出了什麼。 – MatBailie 2011-05-23 16:27:19