我正在使用 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