我正在寻找一些关于设计简单数据透视的帮助,以便我可以将其链接到我的查询的其他部分。
我的数据是这样的
项目表
如果我运行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
答案 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
关键字。