Tsql 我使用SQL Server 2005时遇到多行显示错误
这是我的Table1结构Tsql 我使用SQL Server 2005时遇到多行显示错误,tsql,sql-server-2005,pivot,Tsql,Sql Server 2005,Pivot,这是我的Table1结构 MRNO IPNO PLNO 1 2 1324 2 3 1325 3 4 1326 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 132
MRNO IPNO PLNO
1 2 1324
2 3 1325
3 4 1326
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
表2结构
MRNO IPNO PLNO
1 2 1324
2 3 1325
3 4 1326
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:13
SQL代码:
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'
但该查询未获取上述格式数据
有人知道吗?您正在尝试的是一个透视查询,将行转换为列,我标记为重复的问题将告诉您如何进行此操作的基本知识,但是那里的答案并没有完全告诉你需要采取的额外步骤,这就是为什么我发布这个答案,尽管我将这个问题标记为重复的 由于dynamic pivot使用诸如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 @sql
可能的重复在旁注中,表名不能以数字开头,除非使用分隔标识符,也就是说,将名称用双引号或括号[]括起来,因此:30TH_PLNTM_数据无效,需要更改为[30TH_PLNTM_DATA]或30TH_PLNTM_数据。