限制列数的交叉数据报表
--示例数据:
CREATETABLEtest(
factoryidvarchar(20),
bagidint,
rollint,
numbernumeric(9,1),
UNIQUE(bagid,roll))
INSERTtestSELECT'M-CS-11#6/GREEN',1,1, 86
UNIONALLSELECT'M-CS-11#6/GREEN',1,2, 59.5
UNIONALLSELECT'M-CS-11#6/GREEN',1,3, 31.2
UNIONALLSELECT'M-CS-11#6/GREEN',1,4, 42
UNIONALLSELECT'M-CS-11#6/GREEN',1,5, 31
UNIONALLSELECT'M-CS-11#6/GREEN',1,6, 114.3
UNIONALLSELECT'M-CS-11#6/GREEN',2,7, 101
UNIONALLSELECT'M-CS-11#6/GREEN',2,8, 83.9
UNIONALLSELECT'M-CS-11#6/GREEN',2,9, 97.5
UNIONALLSELECT'M-CS-11#6/GREEN',2,10,105.4
UNIONALLSELECT'M-CS-11#6/GREEN',3,11,103
UNIONALLSELECT'M-CS-11#6/GREEN',3,12,128.5
UNIONALLSELECT'M-CS-11#6/GREEN',3,13,74.7
UNIONALLSELECT'M-CS-11#6/GREEN',3,14,107
UNIONALLSELECT'M-CS-11#6/GREEN',4,15,73.4
UNIONALLSELECT'M-CS-11#6/GREEN',4,16,100
UNIONALLSELECT'M-CS-11#6/GREEN',4,17,141.5
GO
问题描述:
bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryidbagidrollsn1n2 n3 n4 Total
-----------------------------------------------------------------------------------------------
M-CS-11#6/GREEN1 6 86.059.5 31.2 42.0
M-CS-11#6/GREEN1 31.0114.3 364.0
M-CS-11#6/GREEN2 4 101.083.9 97.5 105.4 387.8
M-CS-11#6/GREEN3 4 103.0128.574.7 107.0 413.2
M-CS-11#6/GREEN4 3 73.4 100.0141.5 314.9
Total 1479.9
(所影响的行数为6行)
--查询处理代码
SELECTa.factoryid,a.bagid,
rolls=CASE
WHENa.roll=0THENCAST(b.rollsasvarchar)
ELSE''END,
a.n1,a.n2,a.n3,a.n4,
Total=CASE
WHENa.rollISNULLTHENCAST(a.Totalasvarchar)
WHENa.roll=(b.rolls-1)/4THENCAST(b.Totalasvarchar)
ELSE''END
FROM(
SELECTfactoryid=CASE
WHENGROUPING(factoryid)=1THEN'Total'
ELSEfactoryidEND,
bagid=CASE
WHENGROUPING(factoryid)=1THEN''
ELSECAST(bagidASVARCHAR)END,
n1=CASE
WHENGROUPING(factoryid)=1THEN''
ELSECAST(SUM(CASEroll%4WHEN0THENnumberEND)ASVARCHAR)END,
n2=CASE
WHENGROUPING(factoryid)=1THEN''
ELSEISNULL(CAST(SUM(CASEroll%4WHEN1THENnumberEND)ASVARCHAR),'')END,
n3=CASE
WHENGROUPING(factoryid)=1THEN''
ELSEISNULL(CAST(SUM(CASEroll%4WHEN2THENnumberEND)ASVARCHAR),'')END,
n4=CASE
WHENGROUPING(factoryid)=1THEN''
ELSEISNULL(CAST(SUM(CASEroll%4WHEN3THENnumberEND)ASVARCHAR),'')END,
Total=SUM(number),
roll=roll/4
FROM(
SELECTfactoryid,bagid,number,
roll=(SELECTCOUNT(DISTINCTroll)
FROMtest
WHEREfactoryid=a.factoryid
ANDbagid=a.bagid
ANDroll<a.roll)
FROMtesta
)aGROUPBYfactoryid,bagid,roll/4WITHROLLUP
HAVINGGROUPING(factoryid)=1ORGROUPING(roll/4)=0
)a
LEFTJOIN(
SELECTfactoryid,bagid,
rolls=COUNT(*),
Total=SUM(number)
FROMtest
GROUPBYfactoryid,bagid
)bONa.factoryid=b.factoryid
ANDa.bagid=b.bagid
GO
原帖地址
分享到:
相关推荐
│ 限制列数的交叉表.sql │ ├─第07章 │ │ 7.1 splitpage.asp │ │ 7.2.1 TOP n 实现的通用分页存储过程.sql │ │ 7.2.2 字符串缓存实现的通用分页存储过程.sql │ │ 7.2.3 临时表缓存实现的通用分页存储...
限制列数的交叉表.sql │ ├─第07章 │ │ 7.1 splitpage.asp │ │ 7.2.1 TOP n 实现的通用分页存储过程.sql │ │ 7.2.2 字符串缓存实现的通用分页存储过程.sql │ │ 7.2.3 临时表...
实例363 动态交叉表(SQLServer 2000) 533 10.19 函数查询 535 实例364 在查询语句中使用格式化函数 536 实例365 在查询语句中使用字符串函数 537 实例366 在查询中使用日期函数 538 ...
sql="insert into 目标数据表 select * from 源数据表" (把源数据表的记录添加到目标数据表) (5) 数据记录统计函数: AVG(字段名) 得出一个表格栏平均值 COUNT(*|字段名) 对数据行数的统计或对某一栏有值的数据...
24210.10.2 设计一个月产品销售交叉表查询 24510.10.3 使用固定列标题的交叉表查询 24610.11 从其他数据库中的表创建查询 24710.12 疑难解答 24810.13 现实世界—优化多表查询 249第11章 用操作查询修改数据 25111.1...
24210.10.2 设计一个月产品销售交叉表查询 24510.10.3 使用固定列标题的交叉表查询 24610.11 从其他数据库中的表创建查询 24710.12 疑难解答 24810.13 现实世界—优化多表查询 249第11章 用操作查询修改数据 25111.1...
24510.10.3 使用固定列标题的交叉表查询 24610.11 从其他数据库中的表创建查询 24710.12 疑难解答 24810.13 现实世界—优化多表查询 249第11章 用操作查询修改数据 25111.1 操作查询入门 25111.2 用生成表查询创建新...
24210.10.2 设计一个月产品销售交叉表查询 24510.10.3 使用固定列标题的交叉表查询 24610.11 从其他数据库中的表创建查询 24710.12 疑难解答 24810.13 现实世界—优化多表查询 249第11章 用操作查询修改数据 25111.1...
24510.10.3 使用固定列标题的交叉表查询 24610.11 从其他数据库中的表创建查询 24710.12 疑难解答 24810.13 现实世界—优化多表查询 249第11章 用操作查询修改数据 25111.1 操作查询入门 25111.2 用生成表查询创建新...
24510.10.3 使用固定列标题的交叉表查询 24610.11 从其他数据库中的表创建查询 24710.12 疑难解答 24810.13 现实世界—优化多表查询 249第11章 用操作查询修改数据 25111.1 操作查询入门 25111.2 用生成表查询创建新...
24210.10.2 设计一个月产品销售交叉表查询 24510.10.3 使用固定列标题的交叉表查询 24610.11 从其他数据库中的表创建查询 24710.12 疑难解答 24810.13 现实世界—优化多表查询 249第11章 用操作查询修改数据 25111.1...
技巧080限制工作表的移动范围 4.2 操作工作表的行和列 技巧081插入单行 技巧082插入多行 技巧083插入数据列 技巧084隐藏/显示数据行 技巧085设置单元格区域的行高 4.3 使用工作表事件 技巧086激活时排序 技巧087...
24510.10.3 使用固定列标题的交叉表查询 24610.11 从其他数据库中的表创建查询 24710.12 疑难解答 24810.13 现实世界—优化多表查询 249第11章 用操作查询修改数据 25111.1 操作查询入门 25111.2 用生成表查询创建新...
24510.10.3 使用固定列标题的交叉表查询 24610.11 从其他数据库中的表创建查询 24710.12 疑难解答 24810.13 现实世界—优化多表查询 249第11章 用操作查询修改数据 25111.1 操作查询入门 25111.2 用生成表查询创建新...
24510.10.3 使用固定列标题的交叉表查询 24610.11 从其他数据库中的表创建查询 24710.12 疑难解答 24810.13 现实世界—优化多表查询 249第11章 用操作查询修改数据 25111.1 操作查询入门 25111.2 用生成表查询创建新...
24510.10.3 使用固定列标题的交叉表查询 24610.11 从其他数据库中的表创建查询 24710.12 疑难解答 24810.13 现实世界—优化多表查询 249第11章 用操作查询修改数据 25111.1 操作查询入门 25111.2 用生成表查询创建新...
24510.10.3 使用固定列标题的交叉表查询 24610.11 从其他数据库中的表创建查询 24710.12 疑难解答 24810.13 现实世界—优化多表查询 249第11章 用操作查询修改数据 25111.1 操作查询入门 25111.2 用生成表查询创建新...
24510.10.3 使用固定列标题的交叉表查询 24610.11 从其他数据库中的表创建查询 24710.12 疑难解答 24810.13 现实世界—优化多表查询 249第11章 用操作查询修改数据 25111.1 操作查询入门 25111.2 用生成表查询创建新...
11.5.4 用表间公式填充交叉表 193 11.6 本章练习 194 第12章、 应用系统管理 196 12.1 自定义数据类型 196 12.2 管理模板 200 12.2.1 设置模板属性 200 12.2.2 设置模板权限 203 12.2.3 删除数据 203 12.2.4 删除...
525 实例359 使用IN引入子查询限定查询范围 526 10.18 交叉表查询 527 实例360 利用Trasform分析数据 527 实例361 利用Trasform动态分析数据 529 实例362 静态交叉表(SQLServer 2000) ...