关于数视图中的数据行数据转换成列数据的问题

xufeiyunwindows 2005-07-25 02:47:05
现在有一表v_Table(其实是从视图中读出的)数据如下:
Name Description Value
-----------------------------------------
Jear 到厂迟到1-3小时 5
Jear 空柜检查 7
Jear 及时返回柜号 10
Jear 空柜检查 3
陈师傅 到厂迟到1-3小时 5
陈师傅 及时准确到达 9
古月历 到厂迟到1-3小时 2
古月历 到达码头 5
------------------------------------------
现在要得到符合以下要求的数据表:
1、列名为:Name、DescriptionN(N:=1..n,代表上述Description中的个数据,每一个就作为一个列名)、Sum(是对每个Description的Sum(Value)运算,即对于每一个Name,其对应的Description所对应的Value的合计,作为该DescriptionN(N:=1..n)的一项数据),显示结果如下:
Name 到厂迟到1-3小时 空柜检查 及时返回柜号 及时准确到达 到达码头
Jear 5 10 10 0 0
陈师傅 5 0 0 9 0
古月历 2 0 0 0 5
这一个已实现:
--行数据转换成列名
declare @sql varchar(8000)
set @sql=''
select @sql=@sql+',['+rtrim(Description)+']=sum(case Descriptionwhen '''+rtrim(Description)+''' then Value else 0 end)'
from v_Table group by Description
--然后,查询
select @sql='Select Name,' +
@sql +
' From v_Table '+
' Group By Name'
-- ok query data by execute the sql command
Exec (@sql);
-- ok
2、列名为:Name、DescriptionN(N:=1..n,代表上述Description中的个数据,每一个就作为一个列名)、Count(是对每个Description的Count运算,即对于每一个Name,其对应的Description的个数,作为该DescriptionN(N:=1..n)的一项数据)
显示上述结果如下:
Name 到厂迟到1-3小时 空柜检查 及时返回柜号 及时准确到达 到达码头
Jear 1 2 1 0 0
陈师傅 1 0 0 1 0
古月历 1 0 0 0 1
现在要求用SQL来得到上述结果。

请教各位大虾
谢谢先
...全文
111 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
paoluo 2005-07-25
  • 打赏
  • 举报
回复
晕了。
xufeiyunwindows 2005-07-25
  • 打赏
  • 举报
回复
谢谢各位啊
尤其是“土人”,
土人真牛,呵呵
vivianfdlpw 2005-07-25
  • 打赏
  • 举报
回复
then value改为then 1即可
paoluo 2005-07-25
  • 打赏
  • 举报
回复
--建立测试环境
Create Table v_Table
(Name Nvarchar(20),
Description Nvarchar(200),
Value Int)
--插入数据
Insert v_Table Values('Jear', N'到厂迟到1-3小时', 5)
Insert v_Table Values('Jear', N'空柜检查', 7)
Insert v_Table Values('Jear', N'及时返回柜号', 10)
Insert v_Table Values('Jear', N'空柜检查', 3)
Insert v_Table Values(N'陈师傅',N'到厂迟到1-3小时', 5)
Insert v_Table Values(N'陈师傅',N'及时准确到达', 9)
Insert v_Table Values(N'古月历',N'到厂迟到1-3小时', 2)
Insert v_Table Values(N'古月历',N'到达码头', 5)
--测试
Declare @sql Nvarchar(4000)
Set @sql=''
Select @sql=@sql+',['+Rtrim(Description)+']=sum(case Description when N'''+Rtrim(Description)+''' then 1 Else 0 end)'
from v_Table group by Description
Select @sql='Select Name' + @sql + ' From v_Table Group By Name'
Exec (@sql);
--删除测试环境
Drop Table v_Table
--结果
/*
Name 到厂迟到1-3小时 到达码头 及时准确到达 及时返回柜号 空柜检查
Jear 1 0 0 1 2
古月历 1 1 0 0 0
陈师傅 1 0 1 0 0
*/
paoluo 2005-07-25
  • 打赏
  • 举报
回复
楼主的语句改一点点就可以的。


--行数据转换成列名
declare @sql varchar(8000)
set @sql=''
select @sql=@sql+',['+rtrim(Description)+']=sum(case Description when '''+rtrim(Description)+''' then Value else 0 end)' --Value改为1即,Description when之间要分开
from v_Table group by Description
--然后,查询
select @sql='Select Name' + --,号去掉。
@sql +
' From v_Table '+
' Group By Name'
-- ok query data by execute the sql command
Exec (@sql);
-- ok
子陌红尘 2005-07-25
  • 打赏
  • 举报
回复
declare @s varchar(8000)
set @s = ''
select @s = @s + ',['+Description+']=sum(case Description when '''+Description+''' then Value end)' from v_Table group by Description
set @s = 'select Name'+@s+' from v_Table group by Name'
exec(@s)
spring_504 2005-07-25
  • 打赏
  • 举报
回复
declare @sql varchar(8000)
set @sql=''
select @sql=@sql+',['+rtrim(Description)+']=sum(case Descriptionwhen '''+rtrim(Description)+''' then 1 else 0 end)'
from v_Table group by Description
--然后,查询
select @sql='Select Name,' +
@sql +
' From v_Table '+
' Group By Name'
-- ok query data by execute the sql command
Exec (@sql);

34,873

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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