这是我的Table1结构
MRNO IPNO PLNO
1 2 1324
2 3 1325
3 4 1326Table2结构
MRNO IPNO PLNO PLNDT PLNTM
1 2 1324 20140430 13:24
1 2 1324 20140430 15:12
1 2 1324 20150501 12:01
1 2 1324 20150501 16:01
1 2 1324 20150501 17:21
1 2 1324 20150502 10:11
1 2 1324 20150502 13:01
1 2 1324 20150502 15:13这是我需要的输出,我想以如下方式显示数据
MRNO IPNO 30TH_PLNTM_DATA 01ST_PLNTM_DATA 02ND_PLNTM_DATA
1 2 13:24 12:01 10:11
1 2 15:12 16:01 13:01
1 2 17:21 15:13SQL代码:
SELECT
MRNO, IPNO,
30TH_PLNTM_DATA.PLNTM,
01ST_PLNTM_DATA.PLNTM,
02ND_PLNTM_DATA.PLNTM
FROM
TABLE1 T1
LEFT JOIN
TABLE2 30TH_PLNTM_DATA ON 30TH_PLNTM_DATA.PLNO = T1.PLNO
AND 30TH_PLNTM_DATA.PLNDT = '20150430'
LEFT JOIN
TABLE2 01ST_PLNTM_DATA ON 01ST_PLNTM_DATA.PLNO = T1.PLNO
AND 01ST_PLNTM_DATA.PLNDT = '20150501'
LEFT JOIN
TABLE2 02ND_PLNTM_DATA ON 02ND_PLNTM_DATA.PLNO = T1.PLNO
AND 02ND_PLNTM_DATA.PLNDT = '20150502'但是那个查询没有得到上面的格式数据..。
有谁知道吗?
发布于 2015-05-12 09:01:28
您想要做的是一个支点查询,将行转换为列,我标记为重复的问题将告诉您如何做到这一点的基本知识,但是那里的答案并没有完全告诉您需要采取的额外步骤,这就是为什么我发布这个答案的原因(尽管我将问题标记为重复)。
由于动态枢轴使用一个聚合函数(如max() )来确定每个新列的值,并按MRNO对数据进行分组,IPNO将得到每个日期的最大PLNTM (PLNDT),您需要添加一个额外的分组层,以获得没有最大值的项的额外行。
要做到这一点,您需要将row_number()函数应用于源数据,这样查询最终将如下所示:
DECLARE @sql AS NVARCHAR(MAX)
DECLARE @cols AS NVARCHAR(MAX)
SELECT @cols= ISNULL(@cols + ',','') + QUOTENAME(PLNDT)
FROM (SELECT DISTINCT PLNDT FROM Table2) AS Types
SET @sql =
N'SELECT MRNO, IPNO, PLNO, ' + @cols + ' FROM (
SELECT
t1.MRNO, t1.IPNO, t1.PLNO, t2.PLNDT, t2.PLNTM,
rn = ROW_NUMBER() OVER (
PARTITION BY t1.MRNO, t1.IPNO, t1.PLNO, t2.PLNDT
ORDER BY t2.PLNDT, t2.PLNTM
)
FROM
TABLE1 T1
JOIN
TABLE2 t2 ON t2.PLNO = T1.PLNO
) X
PIVOT(MAX(plntm)
FOR plndt IN (' + @cols + ')) AS PVTTable'
EXEC sp_executesql @sqlhttps://stackoverflow.com/questions/30184599
复制相似问题