2014-11-06 78 views
0

好吧,我有一个恶性存储过程,结合10个或更多表的数据。这个例子我简化了这个过程,但是我现在需要的是根据LS#中的值将数据从一行转移到一列。棘手的部分是,我需要根据其他5列中的值将数据分组/组合到一行中。这里的数据我的存储过程返回:SQL枢轴并结合不同数量的记录从行到列根据值

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记录,反之亦然记录,但我需要的所有可用的行显示,在相应的字段中显示空白或NULL。我确信这对于一个sql天才来说很容易,但它完全避开了我。

回答

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 ║ 
╚═══════╩════╩══════╩════════╩══════╩═════════╩═══════════╩════════════╝