以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 狐表不支持纵向表转横向表?(分享LXL版主SQL纵转横代码) (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=5749) |
||||
-- 作者:菜鸟foxtable -- 发布时间:2010/1/8 23:16:00 -- 狐表不支持纵向表转横向表?(分享LXL版主SQL纵转横代码) 其中有基础表两个[F费用类别][结算单],结构基本同7楼图片所示表。 这个是动态纵转横: declare @sql varchar(8000) 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更简单。 |
||||
-- 作者:菜鸟foxtable -- 发布时间:2010/1/9 9:29:00 -- 以下是引用czy在2010-1-9 0:07:00的发言:
不懂。 感觉你应该用SQLCrossTableBuilder更简单。 这个不行吧,因为横向表列数固定,而纵向表同一序号的数据行小于等于横向表列数。 |
||||
-- 作者:xl -- 发布时间:2010/1/9 9:42:00 -- 老鸟的提问方式误导了大家: Dim dt As DataTable = DataTables("成绩库") Dim dr1 As DataRow = e.DataRow Dim str As String = "[学号] = \'" & dr1("学号") & "\'" If e.DataCol.Name = "学号" Then Dim dr2 As DataRow = dt.Find(str) If dr2 IsNot Nothing Then dr1("姓名") = dr2("姓名") End If dr2 = dt.Find(str & " And [课程]= \'语文\'") If dr2 IsNot Nothing Then dr1("语文") = dr2("分数") End If dr2 = dt.Find(str & " And [课程]= \'数学\'") If dr2 IsNot Nothing Then dr1("数学") = dr2("分数") End If End If
|
||||
-- 作者:菜鸟foxtable -- 发布时间:2010/1/9 10:19:00 -- 我可没有误导哦,我需要的只是纵变横,不需要统计。而且是SQL方法。狐表本身的方法我知道,以前C版也教过。 Dim cmd As New SQLCommand |
||||
-- 作者:菜鸟foxtable -- 发布时间:2010/1/9 11:05:00 -- 换个说法,只要达到目的就行。 此主题相关图片如下:表a.png 此主题相关图片如下:表b.png [此贴子已经被作者于2010-1-9 11:06:29编辑过]
|
||||
-- 作者:yangming -- 发布时间:2010/1/9 11:44:00 -- 看看用SQLCrossTableBuilder的统计多个统计表的示例一或示例二 |
||||
-- 作者:czy -- 发布时间:2010/1/9 12:14:00 -- 老鸟,发个示例文件看看,看的不是很明白,最好来个生成临时表后的效果。 |
||||
-- 作者:czy -- 发布时间:2010/1/9 12:19:00 -- 我感觉先用SQLCommand的ExecuteReader生成临时表,然后SQLCrossTableBuilder从临时表中生成交叉表好象可以解决。 |
||||
-- 作者:菜鸟foxtable -- 发布时间:2010/1/9 12:23:00 -- 以下是引用yangming在2010-1-9 11:44:00的发言:
看看用SQLCrossTableBuilder的统计多个统计表的示例一或示例二 看得有些晕,Y版。 此主题相关图片如下:表c.png
[此贴子已经被作者于2010-1-9 12:42:30编辑过]
|