我正在使用 SQL Server 2005 面临多行显示错误
I am using SQL Server 2005 facing multiple rows displaying error
这是我的 Table1
结构
MRNO IPNO PLNO
1 2 1324
2 3 1325
3 4 1326
Table2
结构
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'
但是那个查询没有得到上面格式的数据...
请问有人知道吗?
您尝试做的是数据透视查询,将行转换为列,我标记为重复的问题将告诉您如何执行此操作的基础知识,但那里的答案并没有完全说明关于您需要采取的额外步骤,这就是为什么我 post 这个答案(即使我将问题标记为重复)。
由于动态数据透视使用像 max() 这样的聚合函数来确定每个新列的值应该是哪个项目,并按 MRNO 对数据进行分组,IPNO 将获得每个日期 (PLNDT) 的最大 PLNTM需要添加额外的分组层以获得没有最大值的项目的额外行。
为此,您需要将 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
这是我的 Table1
结构
MRNO IPNO PLNO
1 2 1324
2 3 1325
3 4 1326
Table2
结构
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'
但是那个查询没有得到上面格式的数据...
请问有人知道吗?
您尝试做的是数据透视查询,将行转换为列,我标记为重复的问题将告诉您如何执行此操作的基础知识,但那里的答案并没有完全说明关于您需要采取的额外步骤,这就是为什么我 post 这个答案(即使我将问题标记为重复)。
由于动态数据透视使用像 max() 这样的聚合函数来确定每个新列的值应该是哪个项目,并按 MRNO 对数据进行分组,IPNO 将获得每个日期 (PLNDT) 的最大 PLNTM需要添加额外的分组层以获得没有最大值的项目的额外行。
为此,您需要将 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