大家帮帮忙啊,要是实现下面的统计方式,SQL语句该怎么写?
表(Patient): 
sDeptName(部门)  sType(类型)    Receipt(费用) 
外科                    自费              23 
内科                    新农合            34 
内科                    自费              56 
外科                    医保              34 
…… 请教各位如何用SQL语句如何实现下面的统计方式 ______________________________________________________ 
          ¦      自费    ¦      新农合    ¦      医保  ¦ 
部门      ¦____________________________________________ 
          ¦  人数  金额  ¦  人数  金额    ¦  人数 ¦ 金额 ¦ 
_______________________________________________________ 
          ¦            ¦                ¦            ¦ 
_______________________________________________________ …… 

解决方案 »

  1.   


    SELECT A.自费人数 AS 自费人数,A.自费总金额 AS 自费总金额,B.新农合人数 AS 新农合人数,B.新农合总金额 AS 新农合总金额,C.医保人数 AS 医保人数,
    C.医保总金额 AS 医保总金额 FROM 
    (SELECT SDEPTNAME,COUNT(*) AS 自费人数,SUM(RECEIPT) AS 自费总金额 FROM PATIENT WHERE STYPE=''自费'' GROUP BY SDEPTNAME) A
    LEFT JOIN B ON A.SDEPTNAME=B.SDEPTNAME
    (SELECT SDEPTNAME,COUNT(*) AS 新农合人数,SUM(RECEIPT) AS 新农合总金额 FROM PATIENT WHERE STYPE=''新农合'' GROUP BY SDEPTNAME) B
    LEFT JOIN C ON B.SDEPTNAME=C.SDEPTNAME
    (SELECT SDEPTNAME,COUNT(*) AS  医保人数,SUM(RECEIPT) AS  医保总金额 FROM PATIENT WHERE STYPE='' 医保'' GROUP BY SDEPTNAME) C这样的结果是平列,如果要实现多层表头,DBGrid无法做到,只能使用第三方控件
      

  2.   


    select sDeptName as 部门, 
      sum(case sType when '自费' then 1 else 0 end) as 自费人数,
      sum(case sType when '自费' then Receipt else 0 end) as 自费金额,
      sum(case sType when '新农合' then 1 else 0 end) as 新农合人数,
      sum(case sType when '新农合' then Receipt else 0 end) as 新农合金额,
      sum(case sType when '医保' then 1 else 0 end) as 医保人数,
      sum(case sType when '医保' then Receipt else 0 end) as 医保金额
    from Patient group by sDeptName
      

  3.   

    楼上更高明,学习!
    不过根据LZ的表,对于人数的统计是否应该用count?
      

  4.   

    哦,不用,应该是sum,刚才没看仔细
      

  5.   

    4楼的高明  学习中 sum(case sType when '自费' then 1 else 0 end) as 自费人数, 能否仔细解释下 
      

  6.   

    create table Patient(
    sDeptName varchar(20),
    sType     varchar(20),
    Receipt   float
    )
    insert into Patient
    select '外科',                    '自费',              23
    union
    select '内科',                    '新农合',            34
    union
    select '内科',                    '自费',              56
    union
    select '外科',                    '医保',              34 
    -----------------------------------------------------------declare @strSql varchar(8000)
    set @strSql = 'select sDeptName as 部门'
    select @strSql = @strSql + ', sum(case sType when ''' + sType + ''' then 1 else 0 end)[' + sType + '人数'+ '] , sum(case sType when ''' + sType + ''' then Receipt end) [' +  sType + '金额' + ']'
    from(select distinct sType from  Patient) a
    set @strSql  =   @strSql  +   '   from   Patient   group   by   sDeptName ' 
    print @strSql
    exec(@strSql )-----------------------------------------------------------
    drop table Patient结果
    ------------------------------------------------------------内科 1 34.0 0 NULL 1 56.0
    外科 0 NULL 1 34.0 1 23.0
      

  7.   

    部门 新农合人数 新农合金额 医保人数 医保金额 自费人数 自费金额
    内科 1          34.0       0        NULL      1        56.0
    外科 0          NULL       1        34.0      1        23.0 
      

  8.   

    case语句,因为统计的是人数,如果自费就写成1,否则写成0,这样用sum后,就把为自费的合计数统计出来了。
      

  9.   

    //MSSQL 2005
    //多表头用CxGrid来做,但需要生成六列数据SELECT * FROM PATIENT
    SELECT 
        sDeptName ,[新农合],[自费],[医保] 
    FROM  
        (SELECT *,[费用]=SUM([Receipt]) OVER(PARTITION by sDeptName) FROM Patient) A 
    PIVOT 
        (MAX([Receipt]) FOR [sType] in([人数],[新农合],[自费],[医保])) b 
      

  10.   

    当然,静态语句在程序中意义不大,因为你的sType是记录,变化性也会很大,你可以动态生成SQL语句,用Exec来执行!