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