SQL查询从表中选择多行之一

时间:2013-10-15 15:09:09

标签: sql join db2 ibm-midrange db2-400

我有一个表,其中包含特定值的多行。这是表结构:

NAME,NUMBER,STATUS,DESC,START_DATE,END_DATE
A,3,X,DetailsOfX,13-10-15,13-10-15
A,2,Y,DetailsOfY,13-10-15,13-10-15
A,2,Z,DetailsOfZ,13-10-15,13-10-15
A,1,X,DetailsOfX,12-10-15,12-10-15

我需要的输出是。

A,3,X,DetailsOfX,13-10-15,13-10-15
A,2,Y,DetailsOfY-DetailsofZ,13-10-15,13-10-15
A,1,X,DetailsOfX,12-10-15,12-10-15

所以基本上我想从一个表中选择两行或更多行中的一行,其中包含来自两行的列的数据(上面以粗体显示)。我尝试使用JOIN下面的查询返回4行。

SELECT A.NAME,A.NUMBER,B.STATUS,A.DESC||"-"||B.DESC,A.START_DATE,A.END_DATE
FROM TABLE A
JOIN (SELECT NUMBER,STATUS,DESC,START_DATE,END_DATE FROM TABLE WHERE NAME='A') B
ON A.NAME=B.NAME AND
A.NUMBER=B.NUMBER

有人可以帮我查询可行的查询。

由于

2 个答案:

答案 0 :(得分:1)

如果您使用的是IBM i 7.1(以前称为OS / 400),那么您应该可以使用两个技巧:hierarchical queriesXML functions

请参阅my tutorial under Q: SQL concatenate strings,其中介绍了如何在DB2 for i上执行此操作以合并描述。

GROUP BY您希望将行合并为一行的任何字段,但所有其他列必须是聚合函数的结果。因此,例如,如果您希望每个名称,数字有一行,但Status,StartDate,EndDate具有各种值,那么您需要说min(Status), min(StartDate), max(EndDate)之类的内容。最低状态代码实际上是您要报告的状态代码吗?

如果您的操作系统版本为6.1,您仍然可以使用传统的recursive query(或under v5r4),但您可能需要一个额外的CTE(或两个?)来连接描述。

答案 1 :(得分:0)

您需要使用GROUP BYFOR XML PATH

SELECT 
  X.NAME, X.NUMBER, X.STATUS,
  STUFF((
    SELECT '-' + [Desc] AS Desc 
    FROM YourTable Y
    WHERE Y.ID = X.ID
    FOR XML PATH(''),TYPE),1,1,'') AS DescValues,
  StartDate,
  EndDate
FROM YourTable X
GROUP BY Name, Number, Status, StartDate, EndDate

假设您想要名称,数量,状态,开始日期或结束日期之间的任何差异的单独行。

此外,这是假设SQL Server。