Sql 将包含多列的2行转换为包含多行的2列
我经常在SQLServer2005/2008中运行即席查询,我希望将多列中的两行转换为只有两列的多行 给出这样一个查询:Sql 将包含多列的2行转换为包含多行的2列,sql,sql-server,pivot,Sql,Sql Server,Pivot,我经常在SQLServer2005/2008中运行即席查询,我希望将多列中的两行转换为只有两列的多行 给出这样一个查询: SELECT SUM(CASE WHEN created_at IS NOT NULL THEN 1 END) AS 'TOTAL' , SUM(CASE WHEN created_at > '2013-07-15' THEN 1 END) AS 'CREATED W/I LAST YEAR' , SUM(CASE WHEN updated_a
SELECT
SUM(CASE WHEN created_at IS NOT NULL THEN 1 END) AS 'TOTAL'
, SUM(CASE WHEN created_at > '2013-07-15' THEN 1 END) AS 'CREATED W/I LAST YEAR'
, SUM(CASE WHEN updated_at > '2013-07-15' THEN 1 END) AS 'MODIFIED W/I LAST YEAR'
, SUM(CASE WHEN updated_at < '2011-07-15' THEN 1 END) AS 'UNTOUCHED OVER 3 YEARS'
, SUM(CASE WHEN updated_at < '2009-07-15' THEN 1 END) AS 'UNTOUCHED OVER 5 YEARS'
-- , often there are more columns
FROM
mytable
WHERE
< filtering >
TOTAL: 5000
CREATED W/I LAST YEAR: 500
MODIFIED W/I LAST YEAR: 1500
UNTOUCHED OVER 3 YEARS: 2000
UNTOUCHED OVER 5 YEARS: 1000
我想保持干燥,而不是用工会把一堆精选品串在一起。我从未使用过PIVOT、UNPIVOT或CROSS APPLY。我所看到的关于UNPIVOT的大多数示例似乎都不适用于上面的查询——或者我一定遗漏了什么?这看起来很简单,但我就是不明白。太完美了!我知道事情必须这么简单。谢谢
;WITH t AS (
SELECT
SUM(CASE WHEN created_at IS NOT NULL THEN 1 END) AS 'TOTAL'
, SUM(CASE WHEN created_at > '2013-07-15' THEN 1 END) AS 'CREATED W/I LAST YEAR'
, SUM(CASE WHEN updated_at > '2013-07-15' THEN 1 END) AS 'MODIFIED W/I LAST YEAR'
, SUM(CASE WHEN updated_at < '2011-07-15' THEN 1 END) AS 'UNTOUCHED OVER 3 YEARS'
, SUM(CASE WHEN updated_at < '2009-07-15' THEN 1 END) AS 'UNTOUCHED OVER 5 YEARS'
-- , often there are more columns
FROM
mytable
WHERE
< filtering >
)
SELECT name, value
FROM t
UNPIVOT(value FOR name IN (
[TOTAL]
, [CREATED W/I LAST YEAR]
, [MODIFIED W/I LAST YEAR]
, [UNTOUCHED OVER 3 YEARS]
, [UNTOUCHED OVER 5 YEARS]
)) p