SQL根据值透视并组合行与列之间的不均匀数量的记录

时间:2014-11-06 18:27:31

标签: sql-server pivot

好吧,我有一个恶意存储过程,它结合了10个或更多表的数据。对于这个例子,我已经简化了这个过程,但是我现在需要的是根据LS#中的值将数据从行转移到列。棘手的部分是我需要根据其他5列中的值将数据分组/组合成一行。这是我的存储过程返回的数据:

Calid  ID   GBID   Crs#     Sec#        CrsDesc    LS#
12     2    1449   239002   000001      Reading    02.RE.COM
12     2    1449   239002   000001      Reading    02.RE.DWR
12     2    1449   239002   000001      Reading    BE.K5.A.01
12     2    1449   239002   000001      Reading    BE.K5.B.01
12     2    1449   239002   000001      Reading    BE.K5.C.01

我想要的是:

Calid  ID   GBID   Crs#     Sec#        CrsDesc    LS#         LSBE#
12     2    1449   239002   000001      Reading    02.RE.COM   BE.K5.A.01
12     2    1449   239002   000001      Reading    02.RE.DWR   BE.K5.B.01  
12     2    1449   239002   000001      Reading    NULL        BE.K5.C.01

有时,非BE记录会比非BE记录更多,反之亦然,但我需要显示所有可用行,在相应字段中显示空白或NULL。我确信这对于一个sql天才来说很容易,但它完全是我的意思。

1 个答案:

答案 0 :(得分:1)

好的,这有点麻烦,但确实有效:

;WITH CTE AS
(
    SELECT  *,
            CASE WHEN [LS#] LIKE 'BE%' THEN 1 ELSE 0 END IsBE,
            RN = ROW_NUMBER() OVER(PARTITION BY Calid, ID, [GBID],
                                                [Crs#], [Sec#], [CrsDesc],
                                                CASE WHEN [LS#] LIKE 'BE%' THEN 1 ELSE 0 END 
                                   ORDER BY [LS#])
    FROM YourTable
)
SELECT  ISNULL(A.[Calid],B.[Calid]) [Calid], 
        ISNULL(A.[ID],B.[ID]) [ID], 
        ISNULL(A.[GBID],B.[GBID]) [GBID], 
        ISNULL(A.[Crs#],B.[Crs#]) [Crs#],
        ISNULL(A.[Sec#],B.[Sec#]) [Sec#], 
        ISNULL(A.[CrsDesc],B.[CrsDesc]) [CrsDesc], 
        A.[LS#] [LS#],
        B.[LS#] [LSBE#]
FROM (  SELECT * 
        FROM CTE
        WHERE IsBE = 0) A
FULL JOIN ( SELECT *
            FROM CTE
            WHERE IsBE = 1) B
    ON A.Calid = B.Calid
    AND A.ID = B.ID
    AND A.GBID = B.GBID 
    AND A.[Sec#] = B.[Sec#]
    AND A.CrsDesc = B.CrsDesc
    AND A.RN = B.RN;

Here is a sqlfiddle及其演示。结果是:

╔═══════╦════╦══════╦════════╦══════╦═════════╦═══════════╦════════════╗
║ Calid ║ ID ║ GBID ║  Crs#  ║ Sec# ║ CrsDesc ║    LS#    ║   LSBE#    ║
╠═══════╬════╬══════╬════════╬══════╬═════════╬═══════════╬════════════╣
║    12 ║  2 ║ 1449 ║ 239002 ║    1 ║ Reading ║ 02.RE.COM ║ BE.K5.A.01 ║
║    12 ║  2 ║ 1449 ║ 239002 ║    1 ║ Reading ║ 02.RE.DWR ║ BE.K5.B.01 ║
║    12 ║  2 ║ 1449 ║ 239002 ║    1 ║ Reading ║ NULL      ║ BE.K5.C.01 ║
╚═══════╩════╩══════╩════════╩══════╩═════════╩═══════════╩════════════╝