以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  狐表不支持纵向表转横向表?(分享LXL版主SQL纵转横代码)  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=5749)

--  作者:菜鸟foxtable
--  发布时间:2010/1/8 23:16:00
--  狐表不支持纵向表转横向表?(分享LXL版主SQL纵转横代码)
其中有基础表两个[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更简单。
--  作者:菜鸟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
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目1.table


--  作者:菜鸟foxtable
--  发布时间:2010/1/9 10:19:00
--  
以下是引用xl在2010-1-9 9:42:00的发言:
老鸟的提问方式误导了大家:
 下载信息  [文件大小:304.0 KB  下载次数:0]
图片点击可在新窗口打开查看点击浏览该文件:管理项目1.table

图片点击可在新窗口打开查看我可没有误导哦,我需要的只是纵变横,不需要统计。而且是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


--  作者:菜鸟foxtable
--  发布时间:2010/1/9 11:05:00
--  

换个说法,只要达到目的就行。
SQL后台数据有如下两表,根据表A的费别生成临时数据(列名对应表A所有费别+表B.编码)


图片点击可在新窗口打开查看此主题相关图片如下:表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
--  
我感觉先用SQLCommandExecuteReader生成临时表,然后SQLCrossTableBuilder从临时表中生成交叉表好象可以解决。
--  作者:菜鸟foxtable
--  发布时间:2010/1/9 12:23:00
--  
以下是引用yangming在2010-1-9 11:44:00的发言:

看看用SQLCrossTableBuilder的统计多个统计表的示例一或示例二

图片点击可在新窗口打开查看看得有些晕,Y版。

我只要下面这样就好。列名除了编码,其余根据表A动态增加。表B中没有的自动为0


图片点击可在新窗口打开查看此主题相关图片如下:表c.png
图片点击可在新窗口打开查看
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目5.table

[此贴子已经被作者于2010-1-9 12:42:30编辑过]