从select语句中获取旋转表

时间:2018-01-11 08:48:09

标签: sql sql-server pivot

我有一个名为T726的表,其中包含类似以下示例的数据(该示例是Select * from T726的结果):

id      |   regvalue  |   timest
-----------------------------------
id16    |   541       | 1510141964
id17    |   80        | 1510141964
id700   |   17012547  | 1510141964
id701   |   306045210 | 1510141964
id16    |   773       | 1510141975
id17    |   90        | 1510141975
id700   |   17012547  | 1510141975
id701   |   306045211 | 1510141975
id16    |   478       | 1510142008
id17    |   23        | 1510142008
id700   |   17012547  | 1510142008
id701   |   306045212 | 1510142008
id16    |   90        | 1510146939
id17    |   11        | 1510146939
id700   |   17013961  | 1510146939
id701   |   306045170 | 1510146939

在我的SQL客户端上(我目前正在使用SQuirreL),可以选择将结果作为旋转表获取,如下例所示:

timestamp    |   id16   |   id17  |   id700     |   id701      |
----------------------------------------------------------------
1510141964   |   541    |   80    |   17012547  |   306045210  |
1510141975   |   773    |   90    |   17012547  |   306045211  |
1510142008   |   478    |   23    |   17012547  |   306045212  |
1510146939   |   90     |   11    |   17013961  |   306045170  |

我在网上冲浪,发现有一个名为PIVOT的关系操作。但是,我无法在select语句中使用PIVOT获得该结果。

任何帮助都是apreciated, 提前致谢

3 个答案:

答案 0 :(得分:1)

为什么不使用简单的条件聚合而不是PIVOT运算符

select timest,
       max(case when id= 'id16' then regvalue end) [id16],
       ...
       max(case when id= 'id701' then regvalue end) [id701]
from table
group by timest

编辑pivot使用动态样式

declare @col varchar(max), @q varchar(max)

set @col = stuff(
                    (select  distinct ','+quotename(id) from #tm for xml path('')),
                 1,1,'')

set @q = 'select * from table
          PIVOT 
          (
            MAX(regvalue) FOR id IN ('+@col+')
          )p'

EXEC (@Q)

答案 1 :(得分:1)

使用PIVOT

SELECT
*
FROM YourTable
    PIVOT
    (
        MAX(regvalue)
        FOR
        Id IN
        (
            [id16],[id17],[id700],[id701]
        )
    )P

答案 2 :(得分:0)

请找到解决方案。

数据生成

CREATE TABLE TstPivot     (          id VARCHAR(10)         ,regvalue BIGINT         ,时间BIGINT     )     GO

INSERT INTO TstPivot VALUES
('id16'    ,541       ,1510141964),
('id17'    ,80        ,1510141964),
('id700'   ,17012547  ,1510141964),
('id701'   ,306045210 ,1510141964),
('id16'    ,773       ,1510141975),
('id17'    ,90        ,1510141975),
('id700'   ,17012547  ,1510141975),
('id701'   ,306045211 ,1510141975),
('id16'   ,478       ,1510142008),
('id17'    ,23        ,1510142008),
('id700'   ,17012547  ,1510142008),
('id701'   ,306045212 ,1510142008),
('id16'    ,90        ,1510146939),
('id17'    ,11        ,1510146939),
('id700'   ,17013961  ,1510146939),
('id701'   ,306045170 ,1510146939)
GO

<强>解

SELECT * FROM TstPivot
PIVOT 
(
    MAX(regvalue) FOR id IN ([id16],[id17],[id700],[id701])
)m

输出

timest               id16                 id17                 id700                id701
-------------------- -------------------- -------------------- -------------------- --------------------
1510141964           541                  80                   17012547             306045210
1510141975           773                  90                   17012547             306045211
1510142008           478                  23                   17012547             306045212
1510146939           90                   11                   17013961             306045170

(4 rows affected)