【问题标题】:Pivot in sql server: Vertical to Horizontal data [duplicate]sql server中的数据透视:垂直到水平数据[重复]
【发布时间】:2016-12-07 20:34:36
【问题描述】:

您好,我想在下表上使用数据透视函数:

Id|Number| Code
1 |  34  |abc12345
1 |  23  |xqwe6758
2 |  37  |ghut564hg
3 | 456  |ghut8695
3 |  39  |ghtuj678
3 |  22  |fsdifje12

我希望它水平显示如下:

Id| Code1    | Code2    | Code3
1 | abc12345 | xqwe6758 | null  
2 |ghut564hg | null     | null
3 |ghut8695  | ghtuj678 | fsdifje12


SELECT Id
      ,[Code1]
      ,[Code2]
      ,[Code3]
  FROM(SELECT Id,Code
        FROM [TableName] 
  )d
  pivot(
  max(Id)
  for Code in([Code1],[Code2],[Code3])
  )as piv;

这会在 Id 列上引发无效的列名错误。有人可以帮助识别错误吗?

【问题讨论】:

  • @DanielCorzo :由于我在代码列中有非常随机的值,我不想硬编码该链接中提到的“大小写”值。会有变通办法吗?
  • 最多 3 个代码有限制吗?
  • @Shnugo:是的,每个 ID 最多有 3 个代码

标签: sql-server pivot


【解决方案1】:

您可以使用如下所示的枢轴:

;with cte as 
(
    select  
        id, code, 
        RowN = Row_Number() over (partition by id order by code) 
    from 
        yourtable1
) 
select * 
from cte
pivot ( max(code) for RowN in([1], [2], [3])) p

对于不同的列,您可以使用东西来创建列列表,然后使用动态 SQL 来运行不同的列...但它在 SO 本身的各种示例中都可用...

添加了我的输出:

【讨论】:

  • 它将code1分成一行,code 2在另一行而不是ID号1的一行
  • 那是你需要的输出仪式吗?你能澄清一下所需的输出吗?
  • 同一行表示同一行不同列对吗?这就是这个查询给出的
  • 更新了我的输出...如果您有任何其他列,请告诉我导致此问题的原因...
  • 您能否将第三列的输入样本也提供给我?
【解决方案2】:

试试这个

DECLARE @tbl TABLE(Id INT, Code VARCHAR(100));
INSERT INTO @tbl VALUES
 (1,'abc12345')
,(1,'xqwe6758')
,(2,'ghut564hg')
,(3,'ghut8695')
,(3,'ghtuj678')
,(3,'fsdifje12');

SELECT p.*
FROM
(
    SELECT Id
           ,'Code' + CAST(ROW_NUMBER() OVER(PARTITION BY Id ORDER BY Code) AS VARCHAR(10)) AS ColumnName
           ,Code
    FROM @tbl
) AS t
PIVOT
(
    MAX(Code) FOR ColumnName IN(Code1,Code2,Code3 /*add as many as you need*/)
) AS p

结果

Id  Code1       Code2       Code3
1   abc12345    xqwe6758    NULL
2   ghut564hg   NULL        NULL
3   fsdifje12   ghtuj678    ghut8695

【讨论】:

    猜你喜欢
    • 2013-08-09
    • 2020-02-25
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多