2017-03-27 56 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