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

从不均匀行返回结果的SQL查询,sql,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

我正在使用一个我没有创建的数据库,因此无法更改它-但是我正在使用查询从中提取所需的数据-我对一个包含如下项的表有问题

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的条目的数据

有谁能给我一个正确的方向,让我得到一个完整的结果,显示所有的记录,但每行一个完整的记录

我想这一定是某种IF语句

谢谢-很抱歉这么说

尼尔


PS。抱歉,是这是用于Microsoft SQL Server 2000-8.00.760 Service Pack 3的。对于可选的引用,请使用左连接:

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
Oracle11g为此提供了一个功能


其他DBMS中可能也有类似的功能。

如果您使用的是mysql,则可以使用:

您应该使用PIVOT(对于SQL Server,因为您没有在问题中指定)

结果是

id 1 2 3 4 12562 Orange with skin without skin flesh only 12563 Peach by box NULL NULL 12564 strawberry mixed NULL NULL
这是一种按特定顺序聚合/连接字符串的情况吗?要将不同数量的项连接在一起吗?我觉得自己像一个真正的白痴,不管是这样还是那样。。感谢您仍然收到一个错误-无法解析,然后是语法错误-将重新检查所有内容。@Neil,您使用的MS SQL Server版本是什么(PIVOT仅在2005年及以后提供)?(而且您还需要使用自己的字段和表名…)啊哈,这可以解释DOH-Microsoft SQL Server 2000-8.00.760 Service Pack 3-可能会很高兴向您提及这一点,哈;o) -谢谢您的时间-有什么建议吗?好的,Guffa下面的答案适用于SQL Server 2000-看起来上面的PIVOT适用于2005年等-谢谢all@Neil,刚刚更新了我对2005年以前的sql server的回答,使用了一个模仿Pivot概念的存储过程。。感谢Guffa-效果很好-非常感谢您在这方面花时间;o)
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
execute crosstab 
          'select id from yourtable group by id', 
          'min(data)',
          'reference',
          'yourtable'