SQL Pivot命令

时间:2011-09-08 13:00:48

标签: sql sql-server pivot

我正在寻找一些关于设计简单数据透视的帮助,以便我可以将其链接到我的查询的其他部分。

我的数据是这样的

项目表

如果我运行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  

3 个答案:

答案 0 :(得分:2)

你快到了!您只错过了PARTITION BY中的OVER条款:

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个权重。但是,如果你需要动态数量的列,请看一下这里的一些例子:

答案 1 :(得分:1)

您将需要一个值来形成我对row_number执行的列。结果就是你想要的。我对PIVOT唯一的负面影响是你需要事先了解多少列。我使用类似的方法,但将select构建为动态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

答案 2 :(得分:0)

<强>的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-server
很多问题都是因为T-SQL支持pivot关键字。

请参阅:
Transact SQL Query-Pivot-SQL
Pivot data in T-SQL