【问题标题】:SQL Pivot CommandSQL 透视命令
【发布时间】:2011-09-08 13:00:48
【问题描述】:

我正在寻求有关设计简单枢轴的帮助,以便我可以将其链接到查询的其他部分。

我的数据是这样的

物品表

如果我运行Select * from items,下面是我的表格

ITEM      Weight    
12345         10    
12345         11    
654321        50    
654321        20    
654321       100

此表中有数百个项目,但每个项目代码只会有 每个最多 3 个重量记录。

我想要想要的输出

ITEM     Weight_1    Weight_2     Weight_3
12345          10          11         null
654321         50          20          100

不胜感激任何建议, 我玩过枢轴,但每个后续项目都将权重设为 4、5、6、7 等 而不是从每个项目的 weight1 开始。

谢谢

更新

以下是我目前使用的,

SELECT r.*
FROM   (SELECT 'weight' + CAST(Row_number() OVER (ORDER BY regtime ASC)AS
                               VARCHAR(10))
                      line,
               id,
               weight
        FROM   items it) AS o PIVOT(MIN([weight]) FOR line IN (weight1, weight2,
       weight3)) AS r  

【问题讨论】:

  • 能否请您提供一些您尝试过的示例?
  • 下面是我目前使用的,select r.* from (select 'weight' + CAST( ROW_NUMBER() OVER (order by regtime asc)as varchar(10)) Line, id,它的重量)作为 O Pivot(MIN([weight]) FOR Line IN (weight1, weight2, weight3)) AS r
  • @Robert,在发布新代码时,请更新您的问题。不要在 cmets 中发布代码。我为你这样做了,但请确保你以后也这样做。

标签: sql sql-server pivot


【解决方案1】:

你快到了!您只是缺少OVER 中的PARTITION BY 子句:

SELECT r.*
FROM   (SELECT 'weight' + CAST(Row_number() OVER (PARTITION BY id ORDER BY
                               regtime ASC)
                                      AS
                                              VARCHAR(10)) line,
               id,
               weight
        FROM   items it) AS o PIVOT(MIN([weight]) FOR line IN (weight1, weight2,
       weight3)) AS r  

当您按 ID PARTITION BY 时,将为每个不同的 ID 重置行号。

更新

您不需要动态枢轴,因为您将始终拥有 3 个权重。但是,如果您需要动态列数,请查看此处的一些示例:

【讨论】:

  • 谢谢阿德里安,效果很好!我发现的例子都没有提到“按子句分区”
【解决方案2】:

您将需要一个值来形成我对 row_number 所做的列。结果就是你想要的。我反对 PIVOT 的唯一缺点是您需要提前知道有多少列。我使用类似的方法,但将选择构建为动态 SQL,然后可以插入我的列。

编辑:更新为将列显示为 weight1、weight2 等。

create table #temp (Item int, Weight int)

insert into #temp (Item, Weight) 
Values (12345, 10),
       (12345, 11),
       (654321, 50),
       (654321, 20),
       (654321, 200)

SELECT *
  FROM (SELECT Item,
               Weight,
               'weight' + cast(Row_number() 
                          OVER (partition by Item order by item) as varchar(10)) as seq
          FROM #temp) as Src 
        PIVOT (  MAX(Weight) FOR Seq IN ([Weight1], [Weight2], [Weight3])  ) as PVT

【讨论】:

    【解决方案3】:

    MySQL
    每当您需要枢轴时,请使用group_concat,它将输出您需要的值的 CSV 列表。
    一旦你习惯了使用它,它就是一个很棒的工具。

    SELECT item, GROUP_CONCAT(weight) as weights FROM table1
    GROUP BY item
    

    见:http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

    TSQL 又名 SQL 服务器
    因为 T-SQL 支持 pivot 关键字,所以对此有很多问题。

    见:
    Transact SQL Query-Pivot-SQL
    Pivot data in T-SQL

    【讨论】:

    • 嗨,约翰,感谢您的快速回复。 Group_Concat 在我的 SQL Server Management Studio 中不是一个可识别的函数
    • @Robert,如果您不指定使用哪种 SQL 方言,那么很难做出具体的答案。我不是很清楚。
    猜你喜欢
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 2016-06-29
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多