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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章