Foxtable(狐表)用户栏目专家坐堂 → 狐表不支持纵向表转横向表?(分享LXL版主SQL纵转横代码)


  共有22719人关注过本帖树形打印复制链接

主题:狐表不支持纵向表转横向表?(分享LXL版主SQL纵转横代码)

帅哥哟,离线,有人找我吗?
菜鸟foxtable
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 菜鸟中的老鸟
等级:七尾狐 帖子:1486 积分:10064 威望:0 精华:9 注册:2008/11/14 8:54:00
狐表不支持纵向表转横向表?(分享LXL版主SQL纵转横代码)  发帖心情 Post By:2010/1/8 23:16:00 [只看该作者]

其中有基础表两个[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
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33951 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2010/1/9 0:07:00 [只看该作者]

不懂。
感觉你应该用SQLCrossTableBuilder更简单。

 回到顶部
帅哥哟,离线,有人找我吗?
菜鸟foxtable
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 菜鸟中的老鸟
等级:七尾狐 帖子:1486 积分:10064 威望:0 精华:9 注册:2008/11/14 8:54:00
  发帖心情 Post By:2010/1/9 9:29:00 [只看该作者]

以下是引用czy在2010-1-9 0:07:00的发言:
不懂。
感觉你应该用SQLCrossTableBuilder更简单。

这个不行吧,因为横向表列数固定,而纵向表同一序号的数据行小于等于横向表列数。


 回到顶部
帅哥哟,离线,有人找我吗?
xl
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:400 积分:3961 威望:0 精华:0 注册:2009/4/28 7:39:00
  发帖心情 Post By: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
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 菜鸟中的老鸟
等级:七尾狐 帖子:1486 积分:10064 威望:0 精华:9 注册:2008/11/14 8:54:00
  发帖心情 Post By: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
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 菜鸟中的老鸟
等级:七尾狐 帖子:1486 积分:10064 威望:0 精华:9 注册:2008/11/14 8:54:00
  发帖心情 Post By:2010/1/9 11:05:00 [只看该作者]

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


图片点击可在新窗口打开查看此主题相关图片如下:表a.png
图片点击可在新窗口打开查看

图片点击可在新窗口打开查看此主题相关图片如下:表b.png
图片点击可在新窗口打开查看
[此贴子已经被作者于2010-1-9 11:06:29编辑过]

 回到顶部
美女呀,离线,留言给我吧!
yangming
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:4109 积分:23338 威望:0 精华:21 注册:2008/9/1 20:07:00
  发帖心情 Post By:2010/1/9 11:44:00 [只看该作者]

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


 回到顶部
帅哥哟,离线,有人找我吗?
czy
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33951 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2010/1/9 12:14:00 [只看该作者]

老鸟,发个示例文件看看,看的不是很明白,最好来个生成临时表后的效果。

 回到顶部
帅哥哟,离线,有人找我吗?
czy
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33951 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2010/1/9 12:19:00 [只看该作者]

我感觉先用SQLCommandExecuteReader生成临时表,然后SQLCrossTableBuilder从临时表中生成交叉表好象可以解决。

 回到顶部
帅哥哟,离线,有人找我吗?
菜鸟foxtable
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 菜鸟中的老鸟
等级:七尾狐 帖子:1486 积分:10064 威望:0 精华:9 注册:2008/11/14 8:54:00
  发帖心情 Post By: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编辑过]

 回到顶部
总数 40 1 2 3 4 下一页