【问题标题】:SQL Server 2014: one column to multiple columns with less rows, how to pivot a table?SQL Server 2014:一列到多列少行,如何透视表?
【发布时间】:2017-04-05 09:38:13
【问题描述】:

我想将一列分成许多列并合并一些列。如何在 SQL Server 2012 中进行修改?

输入

|   Cust   |    Q     |    Val     |
------------------------------------
|    1     |    1     |    10      |
|    2     |    2     |    20      |
|    1     |    2     |    30      |
|    4     |    4     |    40      |
|    4     |    1     |    400     |
|    4     |    2     |    4000    |

输出:如何从输入到这里?

|   Cust   |   ValQI  |   ValQII   |   ValQIII   |    VALQIV    |
-----------------------------------------------------------------
|    1     |    10    |    30      |             |              |
|    2     |          |    20      |             |              |
|    3     |          |            |             |              |
|    4     |    400   |    4000    |             |      40      |

【问题讨论】:

  • Q中有多少个不同的值?
  • @etsa 每年有 4 个季度,因此 10 年有 40 个季度,依此类推。
  • 如何使用 cust 3 获得输出?我认为您在 cust 3 的输入中遗漏了一条记录?
  • @KannanKandasamy 好点,注意到一些错误,修正它们,谢谢!

标签: sql sql-server pivot pivot-table multiple-columns


【解决方案1】:

结合 PIVOT 和 LEFT OUTER JOIN

WITH C AS
(
    SELECT *
    FROM (VALUES (1), (2), (3), (4)) AS T(Cust)
)
SELECT C.Cust, [1] AS ValQI, [2] AS ValQII, [3] AS ValQIII, [4] AS ValQIV
FROM C
LEFT OUTER JOIN 
(
    SELEcT *
    FROM 
    (VALUES 
        (1, 1, 10), 
        (2, 2, 20), 
        (1, 2, 30), 
        (4, 4, 40), 
        (4, 1, 400), 
        (4, 2, 4000)
    ) AS T(Cust, Q, Val)
    PIVOT (MAX([Val]) FOR [Q] IN ([1], [2], [3], [4])) AS P
) AS TT ON C.Cust = TT.Cust 

【讨论】:

  • 您能解释一下max 的用途吗?该案例没有取值的任何最大值,所以我怀疑它为什么存在。
  • PIVOT 在内部执行 GROUP BY。如何在组内获取值?在您的情况下,由于没有重复,它可以是 MIN/MAX/SUM/AVERAGE。
  • 我认为 90 是 2005 年的,而 2012 年是 110 年。您能否通过 SELECT name, compatibility_level FROM sys.databases; 再次检查兼容性级别并检查 docs.microsoft.com/en-us/sql/t-sql/statements/…
  • 兼容性级别是 120,显然是 SQL Server 2014 和该文档的引擎 12(显然不是 SQL Server 2012?)。
  • 我无法使用兼容级别 110 或 120 重现错误。您能分辨出哪个“Cust”导致错误吗?
【解决方案2】:

您可以在 SQL Server 中使用数据透视表在 SQL Server 中转置这样的数据。

;with cte as (
select cust, RowN = Row_Number() over (partition by cust order by q), val from #yourPivot )
select * from cte
pivot (max(val) for RowN in ([1],[2], [3],[4])) p

你的输入表:

create table #yourPivot (cust int, Q int, Val int)

insert into #yourPivot (cust, q, val) values
 (   1    ,   1     ,    10      )
,(   2    ,   2     ,    20      )
,(   1    ,   1     ,    30      )
,(   4    ,   4     ,    40      )
,(   4    ,   1     ,    400     )
,(   4    ,   2     ,    4000    )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    相关资源
    最近更新 更多