【问题标题】:Sum all column value in a row in SQL Server汇总 SQL Server 中一行中的所有列值
【发布时间】:2015-07-09 13:10:19
【问题描述】:

我在 SQL Server 中有一个包含 34 列的表。

我需要在 SQL Server 中对一行中的所有列值求和。

表:[CALEN]

列:

YEAR_   | MONTH_  |D1 | D2 | D3 | D4 | D5 .... | D31 | Days
------------------------------------------------------------
1392    | 12      | 1 | 1  | 2  | 1  |  4  ... | 0   | 29

我想要计算具有 1 个值的列计算此查询:

select [All_column value is 1 and Start With D] 
FROM [CALEN]   
WHERE YEAR_ = 1392 and MONTH_ = 12

【问题讨论】:

  • 阿萨拉姆阿莱库姆。术语“总和所有列值”是指所有列的值的总和,还是仅 D1、D2、D3 ...... D31 列的总和?
  • 你的意思是你需要一个可以在每个表中工作的动态查询还是只针对这个表的查询?
  • 没有。只为这张桌子。我想要计算具有 1 个值的列
  • @leylaazari,你的问题有点令人困惑。将真实数据和您的预期结果添加到您的问题中

标签: sql sql-server sql-server-2008


【解决方案1】:

您需要取消透视表:

SELECT  YEAR_, MONTH_, DAY_, COUNT_
FROM    (SELECT * FROM [CALEN] WHERE YEAR_ = 1392 and MONTH_ = 12) CALEN_FILTER
UNPIVOT (COUNT_ FOR DAY_ IN (D1, D2, D3, D4, D5, D6, D7, D8, D9, D10,
  D11, D12, D13, D14, D15, D16, D17, D18, D19,
  D20, D21, D22, D23, D24, D25, D26, D27, D28, D29,
  D30, D31)) AS CALEN_UNPIVOTED

然后您可以轻松地进行常见的聚合查询,也许更容易将上面的查询放在 CTE 中,例如,

WITH CALEN_U (YEAR_, MONTH_, DAY_, COUNT_) AS (
    SELECT  YEAR_, MONTH_, DAY_, COUNT_
    FROM    (SELECT * FROM [CALEN] WHERE YEAR_ = 1392 and MONTH_ = 12) CALEN_FILTER
    UNPIVOT (COUNT_ FOR DAY_ IN (D1, D2, D3, D4, D5, D6, D7, D8, D9, D10,
      D11, D12, D13, D14, D15, D16, D17, D18, D19,
      D20, D21, D22, D23, D24, D25, D26, D27, D28, D29,
      D30, D31)) AS CALEN_UNPIVOTED
)
SELECT YEAR_, MONTH_, COUNT(DAY_)
FROM CALEN_U 
WHERE COUNT_ = 1
GROUP BY YEAR_, MONTH_

编辑:请参阅SQLFiddle,使用 10 天。

【讨论】:

  • 使用您的代码时出现此错误:“UNPIVOT”附近的语法不正确。您可能需要将当前数据库的兼容级别设置为更高的值才能启用此功能。请参阅 ALTER DATABASE 的 SET COMPATIBILITY_LEVEL 选项的帮助。
  • 我用的是Sqlserver2008R2。
  • 我添加了一个 sqlfiddle,可以正常使用 10 天。看不到错误原因,请检查是否输入正确。
  • 我使用此代码进行兼容性错误:ALTER DATABASE databasename SET COMPATIBILITY_LEVEL = 100
  • 如何将这个计数放入 sql 中的变量中?
【解决方案2】:

你可以这样做:

SELECT 
CASE WHEN D1 = 1 THEN 1 ELSE 0 END +
CASE WHEN D2 = 1 THEN 1 ELSE 0 END +
CASE WHEN D3 = 1 THEN 1 ELSE 0 END +
CASE WHEN D4 = 1 THEN 1 ELSE 0 END +
.
.
.
CASE WHEN D31 = 1 THEN 1 ELSE 0 END AS TOTAL_D
FROM [CALEN]   
WHERE YEAR_ = 1392 AND MONTH_ = 12

SQL Fiddle

【讨论】:

    【解决方案3】:

    试试这个:

    SELECT D1, D2, D3, ... ... ... D31, 
    (D1 + D2 + ... ... ... D31) as 'Days'
    FROM [CALEN]
    WHERE YEAR_ = 1392 and MONTH_ = 12
    

    【讨论】:

      【解决方案4】:

      试试这个:

      select year,month,D1,D2,D3....D31,
      ((nullif(count(D1),''))+(nullif(count(D2),''))+.....
      (nullif(count(D31),''))) as Total
      group by year, month
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多