【问题标题】:SQL Transpose table - sqlserver [duplicate]SQL转置表 - sqlserver [重复]
【发布时间】:2014-07-22 07:26:17
【问题描述】:

我有下表

create table mytab (
  mID int primary key,
  pname varchar(100) not null,
  pvalue varchar(100) not null
)

示例数据看起来像

mID     |pname  |pvalue
-----------------------
1       |AAR    |   2.3
1       |AAM    |   1.2
1       |GXX    |     5
2       |AAR    |   5.4
2       |AAM    |   3.0
3       |AAR    |   0.2

我想把桌子翻转过来

mID     | AAR   |   AAM |    GXX|
---------------------------------
1       | 2.3   |   1.2 |      5|
2       | 5.4   |   3.0 |      0|
3       | 0.2   |     0 |      0

这有可能吗?如果有,有没有办法创建动态查询,因为有很多这样的 pname pvalue 对

【问题讨论】:

标签: sql sql-server pivot


【解决方案1】:

Dynamic Pivot Query为:

DECLARE @cols AS NVARCHAR(MAX)
DECLARE @query AS NVARCHAR(MAX)
DECLARE @colsFinal AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' +
                        QUOTENAME(pname)
                      FROM mytab
                      FOR XML PATH(''), TYPE
                     ).value('.', 'NVARCHAR(MAX)') 
                        , 1, 1, '')


select @colsFinal =  STUFF((SELECT distinct ',' +
                        'ISNULL('+QUOTENAME(pname)+',0) AS '+ QUOTENAME(pname)
                      FROM mytab
                      FOR XML PATH(''), TYPE
                     ).value('.', 'NVARCHAR(MAX)') 
                        , 1, 1, '')
--Edited query to replace null with 0 in Final result set.
SELECT @query = 'SELECT mID, '+@colsFinal +'
FROM mytab
PIVOT
(
  MAX(pvalue)
  FOR pname IN(' + @cols + ')) AS p;'


exec sp_executesql @query

Check demo here..

【讨论】:

  • 执行(@query)丢失..
  • @bvr 谢谢..我已经将它与演示链接一起添加..
  • 到目前为止有效,问题是我有几行具有相同的 mID。我想每行有一个 mID
  • 这不应该是这种情况,因为 Pivoting 已经根据 mID 列进行分组。请发布造成问题的行数据
【解决方案2】:

使用如下格式的数据透视:

select *
From (select *
     From mytab)p
PIVOT(SUM(pvalue) FOR pname IN ([AAR],[AAM],[GXX]))pvt

为了动态PIVOT使用流动引用:

Dynamic PIVOT Sample1

Dynamic PIVOT Sample2

【讨论】:

  • 您的语句有语法错误。 paren 不见了,即使我关闭它,它也不起作用
  • 我编辑我的帖子。请再次检查。
【解决方案3】:
Declare @t table (mID INT, pname VARCHAR(10),  pvalue  FLOAT)
INSERT INTO @t (mID,pname,pvalue)values (1,'AAR',2.3)
INSERT INTO @t (mID,pname,pvalue)values (1,'AAM',  1.2)
INSERT INTO @t (mID,pname,pvalue)values (1,'GXX',  5)
INSERT INTO @t (mID,pname,pvalue)values (2,'AAR',  5.4)
INSERT INTO @t (mID,pname,pvalue)values (2,'AAM',  0.3)
INSERT INTO @t (mID,pname,pvalue)values (3,'AAR',  0.2)
select  mid,
CASE WHEN [AAR]IS NOT NULL THEN [AAR] ELSE ISNULL([AAR],0)END [AAR], 
CASE WHEN [AAM]IS NOT NULL THEN [AAM] ELSE ISNULL([AAM],0)END [AAM], 
CASE WHEN [GXX]IS NOT NULL THEN [GXX] ELSE ISNULL([GXX],0)END [GXX]
from
(
  select mID, pvalue,pname
  from @t
) d
pivot
(
  max(pvalue)
  for pname in ( [AAR], [AAM], [GXX])
) piv;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 2018-09-05
    相关资源
    最近更新 更多