Tsql 我使用SQL Server 2005时遇到多行显示错误

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

这是我的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     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_数据。