有1个表
account 表代表账务表
其 结构如下
(房号,帐号,消费代码,说明,消费类型代码,消费金额)
room acc code deli lx je
301 A001 000 房租 01 200
301 A001 000 房租 01 50
302 A001 000 房租 01 300
303 A002 003 可乐 02 5
303 A002 004 雪碧 02 10
(注不同房号帐号有可能相同,消费代码000 房租 属于 01 房租类别
003,004 都属于 02 客吧类别)
请教如何用语法得到每个房间按消费类别的统计。谢谢房号,帐号 ,房租类别 ,客吧类别
301 A001 250 0
302 A001 300 0
303 A002 0 15谢谢大家
account 表代表账务表
其 结构如下
(房号,帐号,消费代码,说明,消费类型代码,消费金额)
room acc code deli lx je
301 A001 000 房租 01 200
301 A001 000 房租 01 50
302 A001 000 房租 01 300
303 A002 003 可乐 02 5
303 A002 004 雪碧 02 10
(注不同房号帐号有可能相同,消费代码000 房租 属于 01 房租类别
003,004 都属于 02 客吧类别)
请教如何用语法得到每个房间按消费类别的统计。谢谢房号,帐号 ,房租类别 ,客吧类别
301 A001 250 0
302 A001 300 0
303 A002 0 15谢谢大家
from account
group by room,acc
/******************************************************************************************************************************************************
以学生成绩为例子,比较形象易懂整理人:中国风(Roy)日期:2008.06.06
******************************************************************************************************************************************************/--1、行互列
--> --> (Roy)生成測試數據
if not object_id('Class') is null
drop table Class
Go
Create table Class([Student] nvarchar(2),[Course] nvarchar(2),[Score] int)
Insert Class
select N'张三',N'语文',78 union all
select N'张三',N'数学',87 union all
select N'张三',N'英语',82 union all
select N'张三',N'物理',90 union all
select N'李四',N'语文',65 union all
select N'李四',N'数学',77 union all
select N'李四',N'英语',65 union all
select N'李四',N'物理',85
Go
--2000方法:
动态:declare @s nvarchar(4000)
set @s=''
Select @s=@s+','+quotename([Course])+'=max(case when [Course]='+quotename([Course],'''')+' then [Score] else 0 end)'
from Class group by[Course]
exec('select [Student]'+@s+' from Class group by [Student]')
生成静态:select
[Student],
[数学]=max(case when [Course]='数学' then [Score] else 0 end),
[物理]=max(case when [Course]='物理' then [Score] else 0 end),
[英语]=max(case when [Course]='英语' then [Score] else 0 end),
[语文]=max(case when [Course]='语文' then [Score] else 0 end)
from
Class
group by [Student]GO
动态:declare @s nvarchar(4000)
Select @s=isnull(@s+',','')+quotename([Course]) from Class group by[Course]
exec('select * from Class pivot (max([Score]) for [Course] in('+@s+'))b')生成静态:
select *
from
Class
pivot
(max([Score]) for [Course] in([数学],[物理],[英语],[语文]))b生成格式:
/*
Student 数学 物理 英语 语文
------- ----------- ----------- ----------- -----------
李四 77 85 65 65
张三 87 90 82 78(2 行受影响)
*/------------------------------------------------------------------------------------------
go
--加上总成绩(学科平均分)--2000方法:
动态:declare @s nvarchar(4000)
set @s=''
Select @s=@s+','+quotename([Course])+'=max(case when [Course]='+quotename([Course],'''')+' then [Score] else 0 end)'
from Class group by[Course]
exec('select [Student]'+@s+',[总成绩]=sum([Score]) from Class group by [Student]')--加多一列(学科平均分用avg([Score]))生成动态:select
[Student],
[数学]=max(case when [Course]='数学' then [Score] else 0 end),
[物理]=max(case when [Course]='物理' then [Score] else 0 end),
[英语]=max(case when [Course]='英语' then [Score] else 0 end),
[语文]=max(case when [Course]='语文' then [Score] else 0 end),
[总成绩]=sum([Score]) --加多一列(学科平均分用avg([Score]))
from
Class
group by [Student]go--2005方法:动态:declare @s nvarchar(4000)
Select @s=isnull(@s+',','')+quotename([Course]) from Class group by[Course] --isnull(@s+',','') 去掉字符串@s中第一个逗号
exec('select [Student],'+@s+',[总成绩] from (select *,[总成绩]=sum([Score])over(partition by [Student]) from Class) a
pivot (max([Score]) for [Course] in('+@s+'))b ')生成静态:select
[Student],[数学],[物理],[英语],[语文],[总成绩]
from
(select *,[总成绩]=sum([Score])over(partition by [Student]) from Class) a --平均分时用avg([Score])
pivot
(max([Score]) for [Course] in([数学],[物理],[英语],[语文]))b 生成格式:/*
Student 数学 物理 英语 语文 总成绩
------- ----------- ----------- ----------- ----------- -----------
李四 77 85 65 65 292
张三 87 90 82 78 337(2 行受影响)
*/go--2、列转行
--> --> (Roy)生成測試數據
if not object_id('Class') is null
drop table Class
Go
Create table Class([Student] nvarchar(2),[数学] int,[物理] int,[英语] int,[语文] int)
Insert Class
select N'李四',77,85,65,65 union all
select N'张三',87,90,82,78
Go--2000:动态:declare @s nvarchar(4000)
select @s=isnull(@s+' union all ','')+'select [Student],[Course]='+quotename(Name,'''')--isnull(@s+' union all ','') 去掉字符串@s中第一个union all
+',[Score]='+quotename(Name)+' from Class'
from syscolumns where ID=object_id('Class') and Name not in('Student')--排除不转换的列
order by Colid
exec('select * from ('+@s+')t order by [Student],[Course]')--增加一个排序生成静态:
select *
from (select [Student],[Course]='数学',[Score]=[数学] from Class union all
select [Student],[Course]='物理',[Score]=[物理] from Class union all
select [Student],[Course]='英语',[Score]=[英语] from Class union all
select [Student],[Course]='语文',[Score]=[语文] from Class)t
order by [Student],[Course]go
--2005:动态:declare @s nvarchar(4000)
select @s=isnull(@s+',','')+quotename(Name)
from syscolumns where ID=object_id('Class') and Name not in('Student')
order by Colid
exec('select Student,[Course],[Score] from Class unpivot ([Score] for [Course] in('+@s+'))b')go
select
Student,[Course],[Score]
from
Class
unpivot
([Score] for [Course] in([数学],[物理],[英语],[语文]))b生成格式:
/*
Student Course Score
------- ------- -----------
李四 数学 77
李四 物理 85
李四 英语 65
李四 语文 65
张三 数学 87
张三 物理 90
张三 英语 82
张三 语文 78(8 行受影响)
*/
go
create table [account]([room] int,[acc] varchar(4),[code] varchar(3),[deli] varchar(4),[lx] varchar(2),[je] int)
insert [account]
select 301,'a001','000','房租','01',200 union all
select 301,'a001','000','房租','01',50 union all
select 302,'a001','000','房租','01',300 union all
select 303,'a002','003','可乐','02',5 union all
select 303,'a002','004','雪碧','02',10select [room],[acc],房租类别=sum(case deli when '房租' then je else 0 end),客吧类别='联表获得?'
from [account]
group by lx,room,[acc]
--测试结果:
/*
room acc 房租类别 客吧类别
----------- ---- ----------- ----------
301 a001 250 联表获得?
302 a001 300 联表获得?
303 a002 0 联表获得?(3 row(s) affected)*/
if object_id('tb') is not null
drop table tb
go
create table tb(room int,acc varchar(100),code varchar(20),deli varchar(20),lx varchar(20),je int)
insert into tb select 301 , 'A001', '000' , '房租' , '01' , 200
union all select 301 , 'A001', '000 ' , '房租 ' , '01' , 50
union all select 302 , 'A001' , '000 ' , '房租' , '01' , 300
union all select 303 , 'A002' , '003', '可乐' , '02' , 5
union all select 303, 'A002' , '004' , '雪碧 ' , '02 ' , 10
select * from tbselect room as 序号,acc AS 账号,sum(case lx when '01' then je else '0' end) AS 房租类别,
sum(case lx when '02' then je else '0' end) AS 客吧类别
from tb
group by room,acc
room acc code deli lx je
----------- ---------------------------------------------------------------------------------------------------- -------------------- -------------------- -------------------- -----------
301 A001 000 房租 01 200
301 A001 000 房租 01 50
302 A001 000 房租 01 300
303 A002 003 可乐 02 5
303 A002 004 雪碧 02 10(5 行受影响)序号 账号 房租类别 客吧类别
----------- ---------------------------------------------------------------------------------------------------- ----------- -----------
301 A001 250 0
302 A001 300 0
303 A002 0 15(3 行受影响)
也就是 01 这个类别里面除了房租 还有其他的消费项目,02类别是可以按类别来统计,就01类别比较特殊,所以我们对房租 ,
必须房租的代码 000 来统计有1个表
account 表代表账务表
其 结构如下
(房号,帐号,消费代码,说明,消费类型代码,消费金额)
room acc code deli lx je
301 A001 000 房租 01 200
301 A001 000 房租 01 50
302 A001 000 房租 01 300
303 A002 003 可乐 02 5
303 A002 004 雪碧 02 10
301 A001 009 杂项 01 500
(注不同房号帐号有可能相同,消费代码000 房租 属于 01 房租类别,
不能把 009统计进去,必须按消费代码000 来统计, 003,004 都属于
02 客吧类别,可以按消费类型代码统计)
(特别注意 009有很多,比如有008,007,006 等不能把去掉 009为特里,进行统计,
同理 消费类型 02 也有很多代码 ,不仅仅是 003 ,004 这2个 )
主要还是要 房租 根据 消费代码 code =000 来统计,客吧根据 消费类型 lx = '02'
来统计请教如何用语法得到每个房间按消费类别的统计。谢谢 房号,帐号 ,房租类别 ,客吧类别
301 A001 250 0
302 A001 300 0
303 A002 0 15 谢谢大家
declare @t table (room int,acc varchar(10),code int,deli varchar(10),lx int,je int)
insert into @t select 301,'A001',000,'房租',01,200
union all select 301,'A001',000,'房租',01,50
union all select 302,'A001',000,'房租',01,300
union all select 303,'A002',003,'可乐',02,5
union all select 303,'A002',004,'雪碧',02,10
--select * from @t
select room ,acc,房租类别=sum(case when lx=01 then je else 0 end),
客吧类别=sum(case when lx=02 then je else 0 end)
from @t group by room ,acc
301 A001 250 0
302 A001 300 0
303 A002 0 15
go
create table [account]([room] int,[acc] varchar(4),[code] varchar(3),[deli] varchar(4),[lx] varchar(2),[je] int)
insert [account]
select 301,'a001','000','房租','01',200 union all
select 301,'a001','000','房租','01',50 union all
select 302,'a001','000','房租','01',300 union all
select 303,'a002','003','可乐','02',5 union all
select 303,'a002','004','雪碧','02',10select [room],[acc]
,房租类别=sum(case code when '000' then je else 0 end)
,客吧类别=sum(case lx when '02' then je else 0 end)
from [account]
group by room,[acc]
--测试结果:
/*
room acc 房租类别 客吧类别
----------- ---- ----------- -----------
301 a001 250 0
302 a001 300 0
303 a002 0 15(3 row(s) affected)*/需求还是不太明了,如果上面还不能解决,LZ加几条反例数据进行说明。