我有一个表,其中包含特定值的多行。这是表结构:
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
有人可以帮我查询可行的查询。
由于
答案 0 :(得分:1)
如果您使用的是IBM i 7.1(以前称为OS / 400),那么您应该可以使用两个技巧:hierarchical queries和XML 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 BY
和FOR 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。