好吧,我有一个恶意存储过程,它结合了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天才来说很容易,但它完全是我的意思。
答案 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 ║
╚═══════╩════╩══════╩════════╩══════╩═════════╩═══════════╩════════════╝