首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我正在使用Server 2005面对多行显示错误

我正在使用Server 2005面对多行显示错误
EN

Stack Overflow用户
提问于 2015-05-12 07:37:02
回答 1查看 31关注 0票数 0

这是我的Table1结构

代码语言:javascript
运行
复制
MRNO   IPNO  PLNO
1      2     1324
2      3     1325
3      4     1326

Table2结构

代码语言:javascript
运行
复制
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

这是我需要的输出,我想以如下方式显示数据

代码语言:javascript
运行
复制
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代码:

代码语言:javascript
运行
复制
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'

但是那个查询没有得到上面的格式数据..。

有谁知道吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-12 09:01:28

您想要做的是一个支点查询,将行转换为列,我标记为重复的问题将告诉您如何做到这一点的基本知识,但是那里的答案并没有完全告诉您需要采取的额外步骤,这就是为什么我发布这个答案的原因(尽管我将问题标记为重复)。

由于动态枢轴使用一个聚合函数(如max() )来确定每个新列的值,并按MRNO对数据进行分组,IPNO将得到每个日期的最大PLNTM (PLNDT),您需要添加一个额外的分组层,以获得没有最大值的项的额外行。

要做到这一点,您需要将row_number()函数应用于源数据,这样查询最终将如下所示:

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30184599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档