2017-03-27 112 views
0

作爲較大查詢的一部分,我有一些子查詢,我想將其轉換爲CASE語句。用SQL中的計算重寫子查詢到CASE語句

子查詢看起來像這樣(和作品):

(SELECT (((SUM(DAm)-(SUM(StcCst)*-1))*100)/NULLIF(SUM(DAm),0)) AS 'DG' FROM [F0001].[dbo].[ProdTr] WHERE AcYrPr = '201601' AND ProdTr.TrTp = 1 AND [F0001].[dbo].[ProdTr].CustNo = '12773') AS dg_period_1 

不過,我似乎還沒有找到把這個變成一個CASE語句任何邏輯方式。

任何幫助,將不勝感激!

+0

子查詢是否只返回1行?乳清你想把它轉換成一個案例陳述?嘗試用一些示例數據重新創建您的場景,並根據此數據顯示您的預期輸出。 – Utsav

+0

@Utsav它包含一個聚合函數和沒有組語句,它_DOES_返回正好1行(不多也不少) – Psi

+0

我看到一個問題'NULLIF(SUM(DAm),0)',因爲你不能劃分一個數字由null。如果SUM(DAm)'爲空,你想要做什麼? – Sunil

回答

3
(
    SELECT CASE 
       WHEN SUM(t1.DAm) <> 0 
       THEN (SUM(t1.DAm) + SUM(t1.StcCst)) * 100/SUM(t1.DAm) 
       ELSE 0 /* or whatever you want to have in this case */ 
      END AS 'DG' 
    FROM [F0001].[dbo].[ProdTr] t1 
    WHERE t1.AcYrPr = '201601' AND 
      t1.TrTp = 1 AND 
      t1.CustNo = '12773' 
) AS dg_period_1 

我也去掉了一些不必要的括號和簡化操作(x - (y * -1) = x + y)

+0

這就是我喜歡這種魅力的原因。這工作非常好!非常感謝! –

+0

很高興幫助:) –

+0

對不起,我太快了 –

1

你可以使用與CASE前提是你要返回一個空當SUM(DAM)爲空或0

下面的語句
(SELECT CASE 
       WHEN SUM(DAm) IS NOT NULL and SUM(DAm) <> 0 THEN (((SUM(DAm) - (SUM(StcCst) * -1)) * 100) /SUM(DAm)) 
       ELSE NULL 
      END AS 'DG' 
    FROM [F0001].[dbo].[ProdTr] 
    WHERE AcYrPr = '201601' 
    AND ProdTr.TrTp = 1 
    AND [F0001].[dbo].[ProdTr].CustNo = '12773') AS dg_period_1 
+0

非常感謝!這也適用:) –

+0

不客氣。 – Sunil