`
dengbaoleng
  • 浏览: 1132118 次
文章分类
社区版块
存档分类
最新评论

限制列数的交叉表

 
阅读更多

限制列数的交叉数据报表

--示例数据:
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脚本大全

    │ 限制列数的交叉表.sql │ ├─第07章 │ │ 7.1 splitpage.asp │ │ 7.2.1 TOP n 实现的通用分页存储过程.sql │ │ 7.2.2 字符串缓存实现的通用分页存储过程.sql │ │ 7.2.3 临时表缓存实现的通用分页存储...

    Sqlserver2000经典脚本

    限制列数的交叉表.sql │ ├─第07章 │ │ 7.1 splitpage.asp │ │ 7.2.1 TOP n 实现的通用分页存储过程.sql │ │ 7.2.2 字符串缓存实现的通用分页存储过程.sql │ │ 7.2.3 临时表...

    SQL查询技巧(范例宝典)

     实例363 动态交叉表(SQLServer 2000) 533  10.19 函数查询 535  实例364 在查询语句中使用格式化函数 536  实例365 在查询语句中使用字符串函数 537  实例366 在查询中使用日期函数 538  ...

    SQL语法大全

    sql="insert into 目标数据表 select * from 源数据表" (把源数据表的记录添加到目标数据表) (5) 数据记录统计函数: AVG(字段名) 得出一个表格栏平均值 COUNT(*|字段名) 对数据行数的统计或对某一栏有值的数据...

    Access 2000数据库系统设计(PDF)---001

    24210.10.2 设计一个月产品销售交叉表查询 24510.10.3 使用固定列标题的交叉表查询 24610.11 从其他数据库中的表创建查询 24710.12 疑难解答 24810.13 现实世界—优化多表查询 249第11章 用操作查询修改数据 25111.1...

    Access 2000数据库系统设计(PDF)---002

    24210.10.2 设计一个月产品销售交叉表查询 24510.10.3 使用固定列标题的交叉表查询 24610.11 从其他数据库中的表创建查询 24710.12 疑难解答 24810.13 现实世界—优化多表查询 249第11章 用操作查询修改数据 25111.1...

    Access 2000数据库系统设计(PDF)---018

    24510.10.3 使用固定列标题的交叉表查询 24610.11 从其他数据库中的表创建查询 24710.12 疑难解答 24810.13 现实世界—优化多表查询 249第11章 用操作查询修改数据 25111.1 操作查询入门 25111.2 用生成表查询创建新...

    Access 2000数据库系统设计(PDF)---003

    24210.10.2 设计一个月产品销售交叉表查询 24510.10.3 使用固定列标题的交叉表查询 24610.11 从其他数据库中的表创建查询 24710.12 疑难解答 24810.13 现实世界—优化多表查询 249第11章 用操作查询修改数据 25111.1...

    Access 2000数据库系统设计(PDF)---011

    24510.10.3 使用固定列标题的交叉表查询 24610.11 从其他数据库中的表创建查询 24710.12 疑难解答 24810.13 现实世界—优化多表查询 249第11章 用操作查询修改数据 25111.1 操作查询入门 25111.2 用生成表查询创建新...

    Access 2000数据库系统设计(PDF)---020

    24510.10.3 使用固定列标题的交叉表查询 24610.11 从其他数据库中的表创建查询 24710.12 疑难解答 24810.13 现实世界—优化多表查询 249第11章 用操作查询修改数据 25111.1 操作查询入门 25111.2 用生成表查询创建新...

    Access 2000数据库系统设计(PDF)---009

    24210.10.2 设计一个月产品销售交叉表查询 24510.10.3 使用固定列标题的交叉表查询 24610.11 从其他数据库中的表创建查询 24710.12 疑难解答 24810.13 现实世界—优化多表查询 249第11章 用操作查询修改数据 25111.1...

    Excel VBA技巧实例手册

    技巧080限制工作表的移动范围 4.2 操作工作表的行和列 技巧081插入单行 技巧082插入多行 技巧083插入数据列 技巧084隐藏/显示数据行 技巧085设置单元格区域的行高 4.3 使用工作表事件 技巧086激活时排序 技巧087...

    Access 2000数据库系统设计(PDF)---012

    24510.10.3 使用固定列标题的交叉表查询 24610.11 从其他数据库中的表创建查询 24710.12 疑难解答 24810.13 现实世界—优化多表查询 249第11章 用操作查询修改数据 25111.1 操作查询入门 25111.2 用生成表查询创建新...

    Access 2000数据库系统设计(PDF)---015

    24510.10.3 使用固定列标题的交叉表查询 24610.11 从其他数据库中的表创建查询 24710.12 疑难解答 24810.13 现实世界—优化多表查询 249第11章 用操作查询修改数据 25111.1 操作查询入门 25111.2 用生成表查询创建新...

    Access 2000数据库系统设计(PDF)---027

    24510.10.3 使用固定列标题的交叉表查询 24610.11 从其他数据库中的表创建查询 24710.12 疑难解答 24810.13 现实世界—优化多表查询 249第11章 用操作查询修改数据 25111.1 操作查询入门 25111.2 用生成表查询创建新...

    Access 2000数据库系统设计(PDF)---025

    24510.10.3 使用固定列标题的交叉表查询 24610.11 从其他数据库中的表创建查询 24710.12 疑难解答 24810.13 现实世界—优化多表查询 249第11章 用操作查询修改数据 25111.1 操作查询入门 25111.2 用生成表查询创建新...

    Access 2000数据库系统设计(PDF)---026

    24510.10.3 使用固定列标题的交叉表查询 24610.11 从其他数据库中的表创建查询 24710.12 疑难解答 24810.13 现实世界—优化多表查询 249第11章 用操作查询修改数据 25111.1 操作查询入门 25111.2 用生成表查询创建新...

    Access 2000数据库系统设计(PDF)---029

    24510.10.3 使用固定列标题的交叉表查询 24610.11 从其他数据库中的表创建查询 24710.12 疑难解答 24810.13 现实世界—优化多表查询 249第11章 用操作查询修改数据 25111.1 操作查询入门 25111.2 用生成表查询创建新...

    勤哲excel服务器2010教程

    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 删除...

    C#程序开发范例宝典10

    525 实例359 使用IN引入子查询限定查询范围 526 10.18 交叉表查询 527 实例360 利用Trasform分析数据 527 实例361 利用Trasform动态分析数据 529 实例362 静态交叉表(SQLServer 2000) ...

Global site tag (gtag.js) - Google Analytics