SQL:将数据从2个表转换为一次转换一行

时间:2015-02-10 04:53:07

标签: sql

我需要帮助才能在以下场景中获得输出表

有2个表:

1. Table Name : TRNNUM Field Name : TRNID

2. Table Name : TRNPRD Field Name : TRNID, PRDID

表格样本:

Table TRNNUM
TRNID
-----
1234
2565
3458

Table TRNPRD
TRNID     PRDID
-----     -----
1234       AA 
1234       BB
1234       CC
2565       CC
2565       EE
2565       FF
2565       HH
3458       AA
3458       BB

所需的输出是:

TempTable

    TRNID    PRDID      PRDSEQ
    -----    -----      ------
    1234     AA         START
    1234     BB         START:AA
    1234     CC         START:AA:BB
    2565     CC         START
    2565     EE         START:CC
    2565     FF         START:CC:EE
    2565     HH         START:CC:EE:FF
    3458     AA         START
    3458     BB         START:AA

你能否提出建议。

提前致谢

1 个答案:

答案 0 :(得分:2)

解决方案因数据库而异,如果使用MySQL您可以使用GROUP_CONCAT()和自我加入:

SELECT a.TRNID,a.PRDID
      ,COALESCE(CONCAT('START:',GROUP_CONCAT(b.PRDID)),'START') AS PRDSEQ
FROM Table1 a
LEFT JOIN Table1 b
  ON a.TRNID = b.TRNID
  AND a.PRDID > b.PRDID
GROUP BY a.TRNID,a.PRDID
ORDER BY a.TRNID,a.PRDID

演示:SQL Fiddle

如果使用SQL Server,您可以使用递归cte:

;with cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY TRNID ORDER BY PRDID) AS RN                    
              FROM Table1
              )
     ,cte2 AS (SELECT TRNID
                     ,PRDID
                     ,CAST('START' AS VARCHAR(MAX)) AS PRDSEQ
                     ,RN
               FROM cte 
               WHERE RN = 1
               UNION ALL
               SELECT a.TRNID
                     ,a.PRDID
                     ,CAST(b.PRDSEQ + ',' + b.PRDID AS VARCHAR(MAX)) AS PRDSEQ
                     ,a.RN
               FROM cte a
               JOIN cte2 b
                 ON a.TRNID = b.TRNID
                 AND a.RN = b.RN + 1
               )
SELECT TRNID,PRDID,REPLACE(PRDSEQ,'START,','START:') AS PRDSEQ
FROM Cte2
ORDER BY TRNID,PRDID

演示:SQL Fiddle

相关问题