交叉表查询生成问题
2010-07-06 01:17
155 查看
设有一张表结构如:(日期,项目,内容)
数据如下
日期 项目 内容
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
数据如下
日期 项目 内容
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
相关文章推荐
- Linq To EF 用泛型时生成的Sql会查询全表的问题
- mssql 数据库“查询处理器用尽了内部资源,无法生成查询计划。”问题的处理
- jquery.dataTables 按条件查询后重新生成表格 点击排序还是原来的数据问题
- 经常用到的交叉表问题,一般用动态SQL能生成动态列!
- 关于Oracle字段类型Date使用mybatis generator自动生成工具出现的查询日期只精确到年月日问题
- 经常用到的交叉表问题,一般用动态SQL能生成动态列
- 经常用到的交叉表问题 一般用动态SQL能生成动态列
- 经常用到的交叉表问题,一般用动态SQL能生成动态列
- 经常用到的交叉表问题,一般用动态SQL能生成动态列!
- InfoPath 生成的XML文件用XPATH查询出错的问题解决(转)
- 报一个比较难以描述的问题【关键字 报表 数据库行列转换 多表交叉查询】
- 水晶报表问题汇总(水晶报表的使用与查询条件生成报表、注册码、打印问题、模式使用示例、C#.Net的WinForm中的使用、程序发布与部署)
- oracle数据库,使用Mybatis生成的mapper.xml文件查询日期型参数时,时分秒丢失的问题
- 使用交叉连接设计查询,生成集合{1,2,3,4......,99,100}
- DotnetBar MapX中动态生成可以查询地图数据的弹出菜单问题
- 经常用到的交叉表问题,一般用动态SQL能生成动态列
- SQL C# nvarchar类型转换为int类型 多表查询的问题,查询结果到新表,TXT数据读取到控件和数据库,生成在控件中的数据如何存到TXT文件中
- 经常用到的交叉表问题,一般用动态SQL能生成动态列!
- web项目--BBS之从数据库查询动态生成版块信息问题分析和小结
- hibernate(jpa)根据实体动态生成查询条件,并实现分页问题的解决方案