0

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

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

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

谢谢

4

2 回答 2

1

如果您使用的是 IBM i 7.1(以前称为 OS/400),您应该可以通过两个技巧来做到这一点: 分层查询XML 函数

请参阅我在 Q: SQL concatenate strings 下的教程,该教程解释了如何在 DB2 for i 上执行此操作以合并描述。

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

如果您的操作系统是 6.1 版,您可能仍然可以使用传统的递归查询(或在 v5r4 下),但您可能需要一个额外的 CTE(或两个?)来连接描述。

于 2013-10-15T23:13:38.507 回答
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。

于 2013-10-15T15:19:49.853 回答