交叉表查询生成问题

    设有一张表结构如:(日期,项目,内容)
    数据如下
       日期    项目     内容
    2003/7/1   早餐     好
    2003/7/1   中餐     不好
    2003/7/1   晚餐     很好
    2003/7/1   加餐     很好

    2003/7/2   早餐     一般
    2003/7/2   中餐     好
    2003/7/2   晚餐     差

    2003/7/3   早餐     一般
    2003/7/3   中餐     好  (7.3半天班,没有晚餐)

    2003/7/4   早餐     一般
    2003/7/4   中餐     好
    2003/7/4   晚餐     差

    2003/7/5   早餐     一般
    2003/7/5   中餐     好
    2003/7/5   晚餐     差

    如一个月有30天,而每天有早、中、晚、加餐四餐。这一张表记录了一天吃了些什么。
    我现在要对一个月用餐情况进行统计,要求显示结构为:

               早餐   中餐    晚餐   加餐
      日期
    2003/7/1    好     不好    很好   很好
    2003/7/2    一般   好      差
    2003/7/3   ……

    试问我应用什么方法来得到这样的一张表?一条 SQL 语句可以吗?存贮过程怎么做?

    select 日期,
    max(case when 项目='早餐' then '内容' end) 早餐,
    max(case when 项目='中餐' then '内容' end) 中餐,
    max(case when 项目='晚餐' then '内容' end) 晚餐,
    max(case when 项目='加餐' then '内容' end) 加餐
    from 一张表 group by 日期

    --------------------------------------------------
    declare @sql varchar(8000)
    set @sql = 'select 日期'
    select @sql = @sql + 'max(case 项目 when '''+项目+'''
                              then 内容 end) '+项目+','
      from (select distinct 项目 from 一张表) as a

    select @sql = left(@sql,len(@sql)-1) + ' from 一张表 group by 日期'

    exec(@sql)

    --------------------------------------------------
    select a.'日期',breakfast= (select b.'项目' from table b where b.'项目' = '早餐' and b.'日期' = a.'日期'),
    lunch= (select c.'项目' from table c where c.'项目' = '午餐' and c.'日期' = a.'日期'),
    supper = (select d.'项目' from table d where d.'项目' = '晚餐' and d.'日期' = a.'日期')
    from table a
    order by '日期'

    附录:一个用ASP编写的可运行示例源代码下载:
    http://blog.why100000.com/wp-content/uploads/2010/07/cross.rar

    作者:张庆(网眼) 西安 PHP 教育培训中心 2003-7-5
    来自“网眼视界”:http://blog.why100000.com
    作者微博:http://t.qq.com/zhangking
    “十万个为什么”电脑学习网:http://www.why100000.com

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值