SQL转置表 - sqlserver [重复]

Posted

技术标签:

【中文标题】SQL转置表 - sqlserver [重复]【英文标题】:SQL Transpose table - sqlserver [duplicate] 【发布时间】: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 对

【问题讨论】:

您需要PIVOT,可能还需要动态SQL。 sqlhints.com/2014/03/18/dynamic-pivot-in-sql-server ***.com/questions/10404348/… 【参考方案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;

【讨论】:

以上是关于SQL转置表 - sqlserver [重复]的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL中的转置表

使用幂查询转置表

在 QSqlQueryModel 中交换标题(转置表)

使用转置表进行 Alpha-beta 修剪,迭代加深

python zip()函数转置表,操作列

具有分析功能的oracle转置[重复]