查看: 6833|回复: 12

[原创] SQl表横竖转换

[复制链接]
论坛徽章:
0
跳转到指定楼层
1#
发表于 2006-1-4 15:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在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


哪位高手请指点。在线等。谢谢
论坛徽章:
1
授权会员
日期:2007-08-24 00:54:44
2#
发表于 2006-1-5 09:16 | 只看该作者
通过递归的select变量可以完成表的横向显示。举个简单的例子:
declare @column varchar(1024)
set @column=''
select @column=@column+cardno+''

使用道具 举报

回复
论坛徽章:
27
ITPUB元老
日期:2008-11-04 00:24:49奥运会纪念徽章:足球
日期:2012-07-11 17:05:242011新春纪念徽章
日期:2011-02-18 11:42:50NBA常规赛纪念章
日期:2010-04-15 14:01:102010年世界杯参赛球队:瑞士
日期:2010-04-02 01:00:092010年世界杯参赛球队:喀麦隆
日期:2010-03-06 23:38:02菠菜明灯
日期:2009-11-16 10:02:37IT宝贝
日期:2009-08-19 13:48:24季节之章:冬
日期:2009-08-03 09:58:34季节之章:秋
日期:2009-08-03 09:58:28
3#
发表于 2006-1-5 09:19 | 只看该作者
select cardno, sum(A1)  'A1',sum(A2) 'A2', sum(A3)  'A3',sum(A4) 'A4', sum(A5)  'A5',sum(A6) 'A6', sum(A7)  'A7'
from
(select cardno,A1 'A1',0 'A2',0 'A3',0 'A4',0 'A5',0 'A6',0 'A7' from VIEW where TYPE='A1'
union all
select cardno,0 'A1',A2 'A2',0 'A3',0 'A4',0 'A5',0 'A6',0 'A7' from VIEW where TYPE='A2'
union all
select cardno,0 'A1',0 'A2',A3 'A3',0 'A4',0 'A5',0 'A6',0 'A7' from VIEW where TYPE='A3'
union all
select cardno,0 'A1',0 'A2',0 'A3',A4 'A4',0 'A5',0 'A6',0 'A7' from VIEW where TYPE='A4'
union all
select cardno,0 'A1',0 'A2',0 'A3',0 'A4',A5 'A5',0 'A6',0 'A7' from VIEW where TYPE='A5'
union all
select cardno,0 'A1',0 'A2',0 'A3',0 'A4',0 'A5',A6 'A6',0 'A7' from VIEW where TYPE='A6'
union all
select cardno,0 'A1',0 'A2',0 'A3',0 'A4',0 'A5',0 'A6',A7 'A7' from VIEW where TYPE='A7'
)a
group by cardno

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2007-08-24 00:54:44
4#
发表于 2006-1-5 09:27 | 只看该作者
通过递归的select变量可以完成表的横向显示。举个简单的例子:
declare @column varchar(1024)
set @column=''
select @column=@column+cardno+''

使用道具 举报

回复
论坛徽章:
0
5#
 楼主| 发表于 2006-1-5 10:25 | 只看该作者
谢谢楼上两位,我先试试。非常感谢提供思路给我。

使用道具 举报

回复
论坛徽章:
27
ITPUB元老
日期:2008-11-04 00:24:49奥运会纪念徽章:足球
日期:2012-07-11 17:05:242011新春纪念徽章
日期:2011-02-18 11:42:50NBA常规赛纪念章
日期:2010-04-15 14:01:102010年世界杯参赛球队:瑞士
日期:2010-04-02 01:00:092010年世界杯参赛球队:喀麦隆
日期:2010-03-06 23:38:02菠菜明灯
日期:2009-11-16 10:02:37IT宝贝
日期:2009-08-19 13:48:24季节之章:冬
日期:2009-08-03 09:58:34季节之章:秋
日期:2009-08-03 09:58:28
6#
发表于 2006-1-5 10:29 | 只看该作者
不好意思,前面的写错了,中间的一部分应该是下面的这个格式。
select cardno,day 'A1',0 'A2',0 'A3',0 'A4',0 'A5',0 'A6',0 'A7' from VIEW where TYPE='A1'

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2006-01-04 13:42:23
7#
发表于 2006-1-5 13:46 | 只看该作者
补充一下, 应该就是这样:

select cardno, sum(A1) 'A1',sum(A2) 'A2', sum(A3) 'A3',sum(A4) 'A4', sum(A5) 'A5',sum(A6) 'A6', sum(A7) 'A7'
from (
select cardno,day 'A1',0 'A2',0 'A3',0 'A4',0 'A5',0 'A6',0 'A7' from VIEW where TYPE='A1'
union all
select cardno,0 'A1',day 'A2 ',0 'A3',0 'A4',0 'A5',0 'A6',0 'A7' from VIEW where TYPE='A2'
union all
select cardno,0 'A1',0 'A2 ',day 'A3',0 'A4',0 'A5',0 'A6',0 'A7' from VIEW where TYPE='A3'
union all
select cardno,0 'A1',0 'A2',0 'A3',day 'A4',0 'A5',0 'A6',0 'A7' from VIEW where TYPE='A4'
union all
select cardno,0 'A1',0 'A2',0 'A3',0 'A4',day 'A5',0 'A6',0 'A7' from VIEW where TYPE='A5'
union all
select cardno,0 'A1',0 'A2',0 'A3',0 'A4',0 'A5',day 'A6',0 'A7' from VIEW where TYPE='A6'
union all
select cardno,0 'A1',0 'A2',0 'A3',0 'A4',0 'A5',0 'A6',day 'A7' from VIEW where TYPE='A7'
)a group by cardno

使用道具 举报

回复
论坛徽章:
0
8#
发表于 2006-1-5 16:23 | 只看该作者
  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

使用道具 举报

回复
论坛徽章:
7
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44奥运会纪念徽章:自行车
日期:2008-10-24 13:07:49CTO参与奖
日期:2009-02-20 09:44:20生肖徽章2007版:马
日期:2009-03-17 22:02:082009日食纪念
日期:2009-07-22 09:30:00生肖徽章2007版:蛇
日期:2009-11-13 11:38:04ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
9#
发表于 2006-1-5 16:26 | 只看该作者
/*
在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

使用道具 举报

回复
论坛徽章:
0
10#
 楼主| 发表于 2006-1-9 15:04 | 只看该作者
最初由 joe_xuqj 发布
[B]select cardno, sum(A1)  'A1',sum(A2) 'A2', sum(A3)  'A3',sum(A4) 'A4', sum(A5)  'A5',sum(A6) 'A6', sum(A7)  'A7'
from
(select cardno,A1 'A1',0 'A2',0 'A3',0 'A4',0 'A5',0 'A6',0 'A7' from VIEW where TYPE='A1'
union all
select cardno,0 'A1',A2 'A2',0 'A3',0 'A4',0 'A5',0 'A6',0 'A7' from VIEW where TYPE='A2'
union all
select cardno,0 'A1',0 'A2',A3 'A3',0 'A4',0 'A5',0 'A6',0 'A7' from VIEW where TYPE='A3'
union all
select cardno,0 'A1',0 'A2',0 'A3',A4 'A4',0 'A5',0 'A6',0 'A7' from VIEW where TYPE='A4'
union all
select cardno,0 'A1',0 'A2',0 'A3',0 'A4',A5 'A5',0 'A6',0 'A7' from VIEW where TYPE='A5'
union all
select cardno,0 'A1',0 'A2',0 'A3',0 'A4',0 'A5',A6 'A6',0 'A7' from VIEW where TYPE='A6'
union all
select cardno,0 'A1',0 'A2',0 'A3',0 'A4',0 'A5',0 'A6',A7 'A7' from VIEW where TYPE='A7'
)a
group by cardno [/B]


最上边一行,A1,A2……是字符类型,怎么可以所用 Sum

使用道具 举报

回复

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

本版积分规则 发表回复

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