SQL语句3维数据绘制报表,不知道如何写效率好,谢谢!

山豆 2010-12-07 10:19:26
谢谢大家,多多帮忙呀!!!!!

已知原始数据表(款式,颜色,尺码 的3维的一个结构)

款式 颜色 尺码 件数
A 红 X 1
A 红 XL 2
A 红 XXL 3
A 绿 X 4
A 黄 XXL 5
A 黄 XLL 6
B 蓝 120M 7
B 蓝 130M 8
B 紫 120M 9
C 白 X 10
C 白 XL 11


得到下面的数据(报表需要的效果)

字段1 字段2 字段3 字段4 字段5 字段6 字段7 字段8

A 颜色 X XL XXL XLL 合计
A 红 1 2 3 6
A 绿 4 4
A 黄 5 6 11
A 合计 5 2 8 6 21

B 颜色 120M 130M 合计
B 蓝 7 8 15
B 紫 9 9
B 合计 16 8 24

C 颜色 X XL 合计
C 白 10 11 21


注: C款只有一个颜色,所以少一个合计



...全文
111 点赞 收藏 15
写回复
15 条回复
山豆 2010年12月07日
to dawugui


就算这个,我也不太清楚怎么搞,能给我示例一下吗 ?
回复 点赞
dawugui 2010年12月07日
[Quote=引用 12 楼 suipianwuda 的回复:]
to dawugui

我可以用游标 ,循环做了A,再做B,这样下去

如果如你说的,单独算好办
[/Quote]也只能这样了.
回复 点赞
山豆 2010年12月07日
to dawugui

我可以用游标 ,循环做了A,再做B,这样下去

如果如你说的,单独算好办
回复 点赞
dawugui 2010年12月07日
[Quote=引用 10 楼 suipianwuda 的回复:]
to dawugui

我也觉得不合理,但是用户习惯看这样的报表,所以头疼 呀,
有的时候没有办法
[/Quote]如果只单独的算A或B或C可以做到,如果要整合到一起,很难办到.帮顶.
回复 点赞
山豆 2010年12月07日
to dawugui

我也觉得不合理,但是用户习惯看这样的报表,所以头疼 呀,
有的时候没有办法
回复 点赞
山豆 2010年12月07日
to WaterMM

SELECT 'B','颜色','120M','130M','合计','',''
UNION ALL
select 款式,颜色=ISNULL(颜色,'合计'),
LTRIM(sum(case when 尺码='120M' THEN 件数 else 0 end)),
LTRIM(sum(case when 尺码='130M' THEN 件数 else 0 end)),
LTRIM(sum(件数)),'',''
from #tb


这些是写死的,用不起来呀,数据之前你不知道是那些尺码,都是活的呀
回复 点赞
dawugui 2010年12月07日
我觉得楼主的这个思维(或思想)不太对.
这种数据格式即使放在前台也不好处理.
回复 点赞
水妹妹 2010年12月07日
写的很弱智
--> 测试数据: #tb
if object_id('tempdb.dbo.#tb') is not null drop table #tb
go
create table #tb (款式 varchar(1),颜色 varchar(5),尺码 varchar(4),件数 int)
insert into #tb
select 'A','红','X',1 union all
select 'A','红','XL',2 union all
select 'A','红','XXL',3 union all
select 'A','绿','X',4 union all
select 'A','黄','XXL',5 union all
select 'A','黄','XLL',6 union all
select 'B','蓝','120M',7 union all
select 'B','蓝','130M',8 union all
select 'B','紫','120M',9 union all
select 'C','白','X',10 union all
select 'C','白','XL',11


SELECT 字段1='A',字段2='颜色',字段3='X',字段4='XL',字段5='XXL',字段6='XLL',字段7='合计'
UNION ALL
select 款式,颜色=ISNULL(颜色,'合计'),
LTRIM(sum(case when 尺码='X' THEN 件数 else 0 end)),
LTRIM(sum(case when 尺码='XL' THEN 件数 else 0 end)),
LTRIM(sum(case when 尺码='XXL' THEN 件数 else 0 end)),
LTRIM(sum(case when 尺码='XLL' THEN 件数 else 0 end)),
LTRIM(sum(件数))
from #tb
where 款式='A'
GROUP BY 款式,颜色
WITH ROLLUP
HAVING(NOT (GROUPING(款式)=1 AND GROUPING(颜色)=1))
union all
SELECT 'B','颜色','120M','130M','合计','',''
UNION ALL
select 款式,颜色=ISNULL(颜色,'合计'),
LTRIM(sum(case when 尺码='120M' THEN 件数 else 0 end)),
LTRIM(sum(case when 尺码='130M' THEN 件数 else 0 end)),
LTRIM(sum(件数)),'',''
from #tb
where 款式='B'
GROUP BY 款式,颜色
WITH ROLLUP
HAVING(NOT (GROUPING(款式)=1 AND GROUPING(颜色)=1))
UNION ALL
SELECT 'C','颜色','X','XL','合计','',''
UNION ALL
select 款式,颜色 ,
LTRIM(sum(case when 尺码='X' THEN 件数 else 0 end)),
LTRIM(sum(case when 尺码='XL' THEN 件数 else 0 end)),
LTRIM(sum(件数)),'',''
from #tb
where 款式='C'
GROUP BY 款式,颜色



字段1 字段2 字段3 字段4 字段5 字段6 字段7
---- ----- ------------ ------------ ------------ ------------ ------------
A 颜色 X XL XXL XLL 合计
A 红 1 2 3 0 6
A 黄 0 0 5 6 11
A 绿 4 0 0 0 4
A 合计 5 2 8 6 21
B 颜色 120M 130M 合计
B 蓝 7 8 15
B 紫 9 0 9
B 合计 16 8 24
C 颜色 X XL 合计
C 白 10 11 21

(11 行受影响)
回复 点赞
billpu 2010年12月07日
3d的 貌似很先进呀
回复 点赞
山豆 2010年12月07日
报表里面比较死的,数据都是存储过程准备的,我也想放入到前台呀
回复 点赞
山豆 2010年12月07日
字段可以定死最多 10个尺码
回复 点赞
dawugui 2010年12月07日
你这个字段数量,名称都不一样,也整在一起?还是单独只算A或B或C的?
回复 点赞
水族杰纶 2010年12月07日
不同尺码对应的字段都不一致
这类报表觉得放前台处理好点
后台做 就行列转换吧 还要分组
回复 点赞
山豆 2010年12月07日
晕, 贴上去 格式有点变化,看的不齐
回复 点赞
山豆 2010年12月07日
继续求解!
回复 点赞
发动态
发帖子
疑难问题
创建于2007-09-28

9306

社区成员

12.1w+

社区内容

MS-SQL Server 疑难问题
社区公告
暂无公告