有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谢谢大家

解决方案 »

  1.   

    select room as 房号,acc as 帐号,sum(case when lx='01' then je else 0 end) as 房租类别,sum(case when lx='02' then je else 0 end) as 客吧类别 
    from account
    group by room,acc
      

  2.   

    --行列互转
    /******************************************************************************************************************************************************
    以学生成绩为例子,比较形象易懂整理人:中国风(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 行受影响)
    */
      

  3.   

    if object_id('[account]') is not null drop table [account]
    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)*/
      

  4.   


    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
      

  5.   

    (5 行受影响)
    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 行受影响)
      

  6.   

    多谢楼上各位高手师傅的热情帮忙。 还有一个小问题。 刚才是 抛砖引玉 实际情况下 ,01 房租类别是我假设的,不存在的。
    也就是 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 谢谢大家
      

  7.   


    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
      

  8.   

    if object_id('[account]') is not null drop table [account]
    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加几条反例数据进行说明。