在SQL Server中连续汇总所有列值

时间:2014-03-16 08:26:05

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

我在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

4 个答案:

答案 0 :(得分:4)

你需要打开你的桌子:

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天。

答案 1 :(得分:0)

您可以这样做:

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

答案 2 :(得分:0)

试试这个:

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

答案 3 :(得分:0)

试试这个:

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