求救:SQL pivot行列转换

nieshiao 2011-05-15 06:40:37
我有一个表
A B C D
a1 通道1 方式一 20
a2 通道2 方式一 55
a3 通道2 方式2 70
a4 通道1 方式2 90
……………………
变成 A 方式一 方式二 方式三
通道一
通道二
…………
C字段中的方式一,方式二,方式三,…………个不确定,
该怎么写呢?
...全文
59 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
nieshiao 2011-06-13
  • 打赏
  • 举报
回复
谢谢大侠们,由于DBA不允许用游标,我最后用PIVOT这个关键字,也可以,而且速度上比用游标快多了。
mrsail 2011-05-25
  • 打赏
  • 举报
回复
做个记号
happvflystone 2011-05-15
  • 打赏
  • 举报
回复
------------------------------------------------------------------------
-- Author :冒牌无枪狙击手V0.2
-- Date : 2011-05-15
-- Version: Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86)
-- Mar 29 2009 10:27:29
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Enterprise Edition on Windows NT 5.2 <X86> (Build 3790: Service Pack 2)
--
------------------------------------------------------------------------
--> Test Data: ta

If Object_Id('ta') Is Not Null
Drop Table ta
GO
Create table ta ([A] Varchar(2),[B] Varchar(5),[C] Varchar(6),[D] Int)
Go
Insert Into ta
Select 'a1','通道1','方式一',20 Union All
Select 'a2','通道2','方式一',55 Union All
Select 'a3','通道2','方式2',70 Union All
Select 'a4','通道1','方式2',90
Go
-->SQL Query:


DECLARE @s varchar(8000) ,@s1 varchar(8000)
SELECT @S = ISNULL(@S + ',','')+ '['+LTRIM([c])+']'
FROM (SELECT DISTINCT [c] FROM ta) A
SELECT @S1 = ISNULL(@S1 + '+','')+ 'isnull(['+LTRIM([c])+'],0)'
FROM (SELECT DISTINCT [c] FROM ta) A
exec('WITH T
AS
(SELECT b,'+@S+'
FROM
(SELECT b,c,d
FROM TA
) P
PIVOT
( SUM ([d])
FOR [c] IN ('+@S+')
)AS UNPVT)
SELECT *,'+@S1+' AS [SUM]
FROM t')
/*
b 方式2 方式一 SUM
----- ----------- ----------- -----------
通道1 90 20 110
通道2 70 55 125

(2 行受影响)
*/
happvflystone 2011-05-15
  • 打赏
  • 举报
回复
大牛们不在,我冒牌帮你写一个
bihai 2011-05-15
  • 打赏
  • 举报
回复
动态拼接.


姓名 课程 分数
---------- ---- -----------
李四 语文 74
李四 数学 84
李四 物理 94
张三 语文 74
张三 数学 83
张三 物理 93

4、使用SQL Server 2005动态SQL
--SQL SERVER 2005动态SQL
Declare @sql nvarchar(4000)
select @sql=isnull(@sql+',','')+quotename(Name)
from syscolumns
where ID=object_id('tb') and Name notin('姓名')
order by Colid
set @sql='select姓名,[课程],[分数] from tb unpivot ([分数] for [课程] in('+@sql+'))b'
exec(@sql)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧