12
返回列表 发新帖
楼主: zxlshashala

[原创] SQl表横竖转换

[复制链接]
论坛徽章:
0
11#
 楼主| 发表于 2006-1-9 15:18 | 只看该作者
最初由 yunyesyes 发布
[B]  declare @sql varchar(8000)
  
  set @sql = 'select cardno,'
  
  select @sql = @sql + '(case type when '''+type +'''
  
  then day else 0 end) as '''+type +''','
  
  from (select distinct type from view) as a
  
  select @sql = left(@sql,len(@sql)-1) + ' from view group by cardno'
  
  exec(@sql)
  
  go [/B]


好像行不通

使用道具 举报

回复
论坛徽章:
0
12#
 楼主| 发表于 2006-1-11 17:55 | 只看该作者
最初由 cosio 发布
[B]/*
在sqlserver中,我有view结果如下:
cardno type day
001 A1 5
001 A2 4
002 A1 3
002 A3 6
……
其中type总共有A1,A2,A3 ……A7七个值,我现在要变成如下表table1:
cardno A1 A2 A3 A4 A5 A6 A7
001 5 4 0 0 0 0 0
002 3 0 6 0 0 0 0

*/

declare @t table
(
        cardno         int,
        type         char(2),
        Cday        int
)
insert into @t
select 1,'A1',5 union all
select 1,'A2',6 union all
select 2,'A3',7 union all
select 2,'A4',8

select * from @t

select cardno,
       A1=sum(case type when 'A1' then isnull(Cday,0) end),
       A2=sum(case type when 'A2' then isnull(Cday,0) end),
       A3=sum(case type when 'A3' then isnull(Cday,0) end),
       A4=sum(case type when 'A4' then isnull(Cday,0) end),
       A5=sum(case type when 'A5' then isnull(Cday,0) end),
       A6=sum(case type when 'A6' then isnull(Cday,0) end),
       A7=sum(case type when 'A7' then isnull(Cday,0) end)
from @t
group by cardno [/B]


用这种方法成功了,但如果cday这列是非数字型比如是字符型的话,sum就不可以用,所以转换过来的表同一个cardno会有好几条记录。这种情况要怎么转换?请高手帮忙。

使用道具 举报

回复
论坛徽章:
1014
红宝石
日期:2013-01-17 12:18:56红宝石
日期:2013-01-17 12:18:56复活蛋
日期:2013-02-27 00:11:48复活蛋
日期:2013-02-27 00:17:48复活蛋
日期:2013-02-27 00:17:48复活蛋
日期:2013-02-27 00:17:48红宝石
日期:2013-01-17 12:18:56红宝石
日期:2012-04-19 09:03:31海蓝宝石
日期:2013-01-18 16:17:53鲜花蛋
日期:2013-02-27 00:11:48
13#
发表于 2006-1-11 18:55 | 只看该作者
再给个列子你看看,希望你能够自己做出来!
CREATE TABLE tb(Groups char(2),Item varchar(10),Color varchar(10),Quantity int)
INSERT tb SELECT 'aa','Table','Blue', 124
UNION ALL SELECT 'bb','Table','Red',  -23
UNION ALL SELECT 'bb','Cup'  ,'Green',-23
UNION ALL SELECT 'aa','Chair','Blue', 101
UNION ALL SELECT 'aa','Chair','Red',  -90

--查询处理
DECLARE @s nvarchar(4000)
--交叉报表处理代码头
SET @s='SELECT Groups'
--生成列记录水平显示的处理代码拼接(处理Item列)
SELECT @s=@s
                +','+QUOTENAME(Item)
                +N'=SUM(CASE Item WHEN '+QUOTENAME(Item,N'''')
                +N' THEN Quantity END)'
FROM tb
GROUP BY Item
--生成列记录水平显示的处理代码拼接(处理Color列)
SELECT @s=@s
                +','+QUOTENAME(Color)
                +N'=SUM(CASE Color WHEN '+QUOTENAME(Color,N'''')
                +N' THEN Quantity END)'
FROM tb
GROUP BY Color
--拼接交叉报表处理尾部,并且执行拼接后的动态SQL语句
EXEC(@s+N'
FROM tb
GROUP BY Groups')
/*--结果
Groups   Chair      Cup      Table     Blue     Green     Red
------------ --------------- -------------- ------------- ------------ -------------- -----------
aa       11         NULL    124      225      NULL    -90
bb       NULL     -23       -23      NULL    -23       -23
--*/

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表