SQL查询返回不均匀行的结果

时间:2011-04-07 11:27:12

标签: sql

我正在使用一个我没有创建的数据库,因此无法更改它 - 但是我使用查询来从中提取我需要的数据 - 我的表有一个像下面这样的条目有问题。

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

4 个答案:

答案 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