我正在使用一个我没有创建的数据库,因此无法更改它 - 但是我使用查询来从中提取我需要的数据 - 我的表有一个像下面这样的条目有问题。
12562 1 Orange
12562 2 with skin
12562 3 without skin
12562 4 flesh only
12563 1 Peach
12563 2 by box
12564 1 Strawberry
12564 2 mixed
我正在尝试将条目放在每个项目ID的单行上
12562 1 Orange 2 with skin 3 Without skin 4 flesh only
12563 1 Peach 2 by box
等
第一列是项目ID,第二列是引用,第三列是数据 - 所有产品都有引用1和2,因此获取这些行很容易 - 有些有3个但是我最终只得到了数据对于1和2,或只是具有1,2和3
的条目的数据任何人都可以给我一个正确的方向来获得一个显示所有记录的完整结果的方法,但每行有1个完整的记录吗?
我认为它必须是某种IF声明..
谢谢 - 抱歉絮絮叨叨。
尼尔
PS。抱歉,这是用于Microsoft SQL Server 2000 - 8.00.760 Service Pack 3
答案 0 :(得分:2)
您应该使用PIVOT( for SQL Server,因为您未在问题中指定)
SELECT
id, [1], [2], [3], [4]
FROM ( SELECT
id, data, reference
FROM yourtable
) p PIVOT ( min(data) FOR [reference]
IN ([1],[2],[3],[4])
) AS pvt
结果是
id 1 2 3 4 12562 Orange with skin without skin flesh only 12563 Peach by box NULL NULL 12564 strawberry mixed NULL NULL
<强>更新强> 对于2005之前的SQL Server
运行http://www.sqlteam.com/article/dynamic-cross-tabs-pivot-tables
处的存储过程并与
一起使用execute crosstab
'select id from yourtable group by id',
'min(data)',
'reference',
'yourtable'
答案 1 :(得分:1)
对于可选的引用使用左连接:
select r1.Id, r1.Name, r2.Name, r3.Name, r4.Name
from Entries r1
inner join Entries r2 on r2.Id = r1.Id and r2.Reference = 2
left join EntrieS r3 on r3.Id = r1.Id and r3.Reference = 3
left join EntrieS r4 on r4.Id = r1.Id and r4.Reference = 4
where r1.Reference = 1
这将为左连接中没有匹配记录的字段返回空值:
12562 Orange with skin without skin flesh only
12563 Peach by box NULL NULL
12564 Strawberry mixed NULL NULL
答案 2 :(得分:0)
Oracle 11g有一个函数LISTAGG。
其他DBMS可能有类似内容。
答案 3 :(得分:0)
如果您使用的是mysql,则可以使用group_concat:
SELECT id, GROUP_CONCAT(CONCAT(reference, " ", data) SEPARATOR " ") as result
FROM tablename
GROUP BY id