大家帮帮忙啊,要是实现下面的统计方式,SQL语句该怎么写?
表(Patient):
sDeptName(部门) sType(类型) Receipt(费用)
外科 自费 23
内科 新农合 34
内科 自费 56
外科 医保 34
…… 请教各位如何用SQL语句如何实现下面的统计方式 ______________________________________________________
¦ 自费 ¦ 新农合 ¦ 医保 ¦
部门 ¦____________________________________________
¦ 人数 金额 ¦ 人数 金额 ¦ 人数 ¦ 金额 ¦
_______________________________________________________
¦ ¦ ¦ ¦
_______________________________________________________ ……
表(Patient):
sDeptName(部门) sType(类型) Receipt(费用)
外科 自费 23
内科 新农合 34
内科 自费 56
外科 医保 34
…… 请教各位如何用SQL语句如何实现下面的统计方式 ______________________________________________________
¦ 自费 ¦ 新农合 ¦ 医保 ¦
部门 ¦____________________________________________
¦ 人数 金额 ¦ 人数 金额 ¦ 人数 ¦ 金额 ¦
_______________________________________________________
¦ ¦ ¦ ¦
_______________________________________________________ ……
解决方案 »
- 报错List index out of bounds (1),越界错误。。求解。。
- REALmagic控件发布了,要的去下,功能齐全,免费哟!!!
- 请问在delphi程序中如何为 sql server 创建一个用户名和密码?并赋于相应的权限。
- 有没有关于Delphi7.0控件详细介绍(包括事件、属性、还有一些函数)的书。
- 关于用D6画矢量图的问题
- 怎样将汉字(一级3755二级3008)与对应的拼音排序!急呀!(高分在线等待……)
- 一个程序里,可以同时有多个ADOQUERY和ADOTABLE组件吗?
- 当Form中的某个控件正在输入值时,如何获得该控件的异常呢?
- 大神们有没有新手项目的教程啊
- 新年大吉!!!!怎样把输入缓冲区10个字符位的数取出来,赋给一个10单元的数组???
- DBrichedit 是不是不能输入字母啊!
- 关于Armadillo 的codegen.dll编程问题.
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无法做到,只能使用第三方控件
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
不过根据LZ的表,对于人数的统计是否应该用count?
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
内科 1 34.0 0 NULL 1 56.0
外科 0 NULL 1 34.0 1 23.0
//多表头用CxGrid来做,但需要生成六列数据SELECT * FROM PATIENT
SELECT
sDeptName ,[新农合],[自费],[医保]
FROM
(SELECT *,[费用]=SUM([Receipt]) OVER(PARTITION by sDeptName) FROM Patient) A
PIVOT
(MAX([Receipt]) FOR [sType] in([人数],[新农合],[自费],[医保])) b