其中有基础表两个[F费用类别][结算单],结构基本同7楼图片所示表。
这个是动态纵转横:
declare @sql varchar(8000)
set @sql = 'select 住院序号'
select @sql = @sql + ',Sum(case 收费类别 when ''' + 收费类别 + ''' then 结算金额 else 0 end) as [' + 收费类别 + ']'
from (select distinct 收费类别 from dbo.F费用类别) as c
set @sql = @sql + ' from
(select a.住院序号,a.结算金额,b.收费类别 from 结算单 a
join F费用类别 b on a.费用类别= b.编码) as d
group by 住院序号'
exec (@sql)
假设收费类别固定,则用静态纵转横:
select 住院序号,
Sum(case 收费类别 when '床位' then 结算金额 else 0 end) as [床位],
Sum(case 收费类别 when '护理' then 结算金额 else 0 end) as [护理],
Sum(case 收费类别 when '检查' then 结算金额 else 0 end) as [检查],
Sum(case 收费类别 when '检验' then 结算金额 else 0 end) as [检验],
Sum(case 收费类别 when '其他' then 结算金额 else 0 end) as [其他],
Sum(case 收费类别 when '手术' then 结算金额 else 0 end) as [手术],
Sum(case 收费类别 when '特需服务' then 结算金额 else 0 end) as [特需服务],
Sum(case 收费类别 when '西药' then 结算金额 else 0 end) as [西药],
Sum(case 收费类别 when '诊查' then 结算金额 else 0 end) as [诊查],
Sum(case 收费类别 when '治疗' then 结算金额 else 0 end) as [治疗],
Sum(case 收费类别 when '中草药' then 结算金额 else 0 end) as [中草药],
Sum(case 收费类别 when '中成药' then 结算金额 else 0 end) as [中成药] from
(select a.住院序号,a.结算金额,b.收费类别 from 结算单 a
join F费用类别 b on a.费用类别= b.编码) as d
group by 住院序号=======================华丽的分割线==============================
问题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
想变成(得到如下结果):
姓名 语文 数学 物理
---- ---- ---- ----
李四 74 84 94
张三 74 83 93
-------------------
下述查询语句报错!
select 姓名 as 姓名 ,
max(case 课程 when '语文' then 分数 else 0 end) 语文,
max(case 课程 when '数学' then 分数 else 0 end) 数学,
max(case 课程 when '物理' then 分数 else 0 end) 物理
from tb
group by 姓名
此主题相关图片如下:qq截图未命名.png
[此贴子已经被作者于2010-1-11 22:32:39编辑过]
以下是引用czy在2010-1-9 0:07:00的发言:
不懂。
感觉你应该用SQLCrossTableBuilder更简单。
这个不行吧,因为横向表列数固定,而纵向表同一序号的数据行小于等于横向表列数。
以下是引用xl在2010-1-9 9:42:00的发言:老鸟的提问方式误导了大家:
我可没有误导哦,我需要的只是纵变横,不需要统计。而且是SQL方法。狐表本身的方法我知道,以前C版也教过。
Dim cmd As New SQLCommand
Dim 统计表A As DataTable
cmd.CommandText = "Select 第一列 , Sum(第二列) AS 第二列 From {表A} Group by 第一列"
统计表A = cmd.ExecuteReader()
Dim ColNames() As String = {"A","B","C","D","E"}
For Each ColName As String In ColNames
Tables("表B").Rows(0)(ColName) = DataTables("表A").Compute("sum(第二列)","[第一列] = '" & ColName & "'")+0
Next
换个说法,只要达到目的就行。
SQL后台数据有如下两表,根据表A的费别生成临时数据(列名对应表A所有费别+表B.编码)
此主题相关图片如下:表a.png
此主题相关图片如下:表b.png
[此贴子已经被作者于2010-1-9 11:06:29编辑过]
看看用SQLCrossTableBuilder的统计多个统计表的示例一或示例二
老鸟,发个示例文件看看,看的不是很明白,最好来个生成临时表后的效果。
以下是引用yangming在2010-1-9 11:44:00的发言:
看看用SQLCrossTableBuilder的统计多个统计表的示例一或示例二
看得有些晕,Y版。
我只要下面这样就好。列名除了编码,其余根据表A动态增加。表B中没有的自动为0
此主题相关图片如下:表c.png
[此贴子已经被作者于2010-1-9 12:42:30编辑过]