【问题标题】:SQL Server : sum of several selectsSQL Server:几个选择的总和
【发布时间】:2018-02-03 10:22:26
【问题描述】:

我有以下代码,它在一个包含几列的表中显示结果。

SELECT 
   ref, design, 
   ISNULL((SELECT Sum(qtt) FROM bi(nolock) WHERE  bi.ndos = 34 AND bofref like #1# AND bi.ref = temp.ref GROUP  BY ref), 0) AS 'LPP', 
   ISNULL((SELECT Sum(qtt) FROM bi(nolock) WHERE  bi.ndos = 28 AND bofref like #1# AND bi.ref = temp.ref GROUP  BY ref), 0) AS 'LPM', 
   ISNULL((SELECT Sum(qtt) FROM bi(nolock) WHERE  bi.ndos = 42 AND bofref like #1# AND bi.ref = temp.ref GROUP  BY ref), 0) AS 'RNPM', 
   ISNULL((SELECT Sum(qtt) FROM bi(nolock) WHERE  bi.ndos = 68 AND bofref like #1# AND bi.ref = temp.ref GROUP  BY ref), 0) AS 'RAM', 
   ISNULL((SELECT Sum(qtt2) FROM bi(nolock) WHERE  bi.ndos = 68 AND bofref like #1# AND bi.ref = temp.ref GROUP  BY ref), 0) AS 'RA' ,
   ISNULL((SELECT Sum(qtt) FROM bi(nolock) WHERE  bi.ndos = 59 AND bofref like #1# AND bi.ref = temp.ref GROUP  BY ref), 0) AS 'GD'
FROM   
    bi(nolock) temp
WHERE  
    (temp.ndos = 34 OR temp.ndos = 28  OR temp.ndos = 42  OR temp.ndos = 68) 
    AND temp.bofref LIKE #1# 
    AND temp.ref NOT LIKE ' ' 
GROUP BY 
    ref, design 
ORDER BY 
    ref

我现在想在一个新列中对某些选择的值求和,例如,我想在一个总列中对“LPP、RNPM 和 RA”列求和,但是我无法让它工作.

怎么做?

【问题讨论】:

  • 删除子查询和用例。在 where 子句中有 like 就像无缘无故地杀死你的查询。
  • 我不知道其他方法可以做到这一点。 #1# 是用户编写的变量,可以有多种格式,如 xx.xxxx.xx 或 xx.xxxx 或 xx。并且代码必须查找与变量匹配的所有结果。

标签: sql sql-server select sum


【解决方案1】:

最直接的方法是将您的查询包装在另一个中:

SELECT sub.*,
       LPP + RNPM + RA as LPP_RNPM_RA
FROM (       
    SELECT ref, design, 
       Isnull((SELECT Sum(qtt) FROM bi(nolock) WHERE  bi.ndos = 34 AND bofref like #1# AND bi.ref = temp.ref GROUP  BY ref), 0) AS 'LPP', 
       Isnull((SELECT Sum(qtt) FROM bi(nolock) WHERE  bi.ndos = 28 AND bofref like #1# AND bi.ref = temp.ref GROUP  BY ref), 0) AS 'LPM', 
       Isnull((SELECT Sum(qtt) FROM bi(nolock) WHERE  bi.ndos = 42 AND bofref like #1# AND bi.ref = temp.ref GROUP  BY ref), 0) AS 'RNPM', 
       Isnull((SELECT Sum(qtt) FROM bi(nolock) WHERE  bi.ndos = 68 AND bofref like #1# AND bi.ref = temp.ref GROUP  BY ref), 0) AS 'RAM', 
       Isnull((SELECT Sum(qtt2) FROM bi(nolock) WHERE  bi.ndos = 68 AND bofref like #1# AND bi.ref = temp.ref GROUP  BY ref), 0) AS 'RA' ,
       Isnull((SELECT Sum(qtt) FROM bi(nolock) WHERE  bi.ndos = 59 AND bofref like #1# AND bi.ref = temp.ref GROUP  BY ref), 0) AS 'GD'
    FROM   bi(nolock) temp
    WHERE  temp.ndos IN (34, 28, 42, 68) 
       AND temp.bofref like #1# 
       AND temp.ref NOT LIKE ' ' 
    GROUP  BY ref, 
          design 
    ) as sub
ORDER  BY ref

请注意,您可以使用 IN 运算符来代替 where 子句中的 OR 组合。

另外,求和的方式看起来很尴尬:不要进行子查询,而是在 select 中这样做:

       Sum(CASE WHEN temp.ndos = 34 THEN qtt ELSE 0 END) AS 'LPP', 

...等等

【讨论】:

  • 我尝试了这个但没有结果。没有错误,但也没有结果。我会尝试看看我是否能找到问题所在。谢谢
【解决方案2】:

如果我理解正确,您可以对单列求和

  SELECT 
          ref
        , design
     Isnull((SELECT Sum(qtt) FROM bi(nolock) WHERE  bi.ndos = 34 AND bofref like #1# AND bi.ref = temp.ref GROUP  BY ref), 0) AS 'LPP', 
     Isnull((SELECT Sum(qtt) FROM bi(nolock) WHERE  bi.ndos = 28 AND bofref like #1# AND bi.ref = temp.ref GROUP  BY ref), 0) AS 'LPM', 
     Isnull((SELECT Sum(qtt) FROM bi(nolock) WHERE  bi.ndos = 42 AND bofref like #1# AND bi.ref = temp.ref GROUP  BY ref), 0) AS 'RNPM', 
     Isnull((SELECT Sum(qtt) FROM bi(nolock) WHERE  bi.ndos = 68 AND bofref like #1# AND bi.ref = temp.ref GROUP  BY ref), 0) AS 'RAM', 
     Isnull((SELECT Sum(qtt2) FROM bi(nolock) WHERE  bi.ndos = 68 AND bofref like #1# AND bi.ref = temp.ref GROUP  BY ref), 0) AS 'RA' ,
     Isnull((SELECT Sum(qtt) FROM bi(nolock) WHERE  bi.ndos = 59 AND bofref like #1# AND bi.ref = temp.ref GROUP  BY ref), 0) AS 'GD',  
     Isnull((SELECT Sum(qtt) FROM bi(nolock) WHERE  bi.ndos = 34 AND bofref like #1# AND bi.ref = temp.ref GROUP  BY ref), 0) + 
     Isnull((SELECT Sum(qtt) FROM bi(nolock) WHERE  bi.ndos = 28 AND bofref like #1# AND bi.ref = temp.ref GROUP  BY ref), 0) + 
     Isnull((SELECT Sum(qtt) FROM bi(nolock) WHERE  bi.ndos = 42 AND bofref like #1# AND bi.ref = temp.ref GROUP  BY ref), 0) + 
     Isnull((SELECT Sum(qtt) FROM bi(nolock) WHERE  bi.ndos = 68 AND bofref like #1# AND bi.ref = temp.ref GROUP  BY ref), 0) as TOTAL_COLUMN 

  FROM   bi(nolock) temp
  WHERE  ( temp.ndos = 34
        OR temp.ndos = 28 
        OR temp.ndos = 42 
        OR temp.ndos = 68 ) 
     AND temp.bofref like #1# 
     AND temp.ref NOT LIKE ' ' 
  GROUP  BY ref, 
        design 
  ORDER  BY ref

【讨论】:

    猜你喜欢
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多