Sql 将包含多列的2行转换为包含多行的2列

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

我经常在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_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