请教高手嵌套查询加with rollup汇总问题(急)

row32hahaha 2009-05-30 04:11:16
我在给公司写一个报表时由于系统框架所限只能使用一条SQL语句实现,所以使用到如下语句:
SELECT DC209,A.*
FROM (
SELECT
CASE WHEN GROUPING(OH002)=1 THEN ''
ELSE DC201 END DC201,
CASE WHEN GROUPING(OH002)=1 THEN ''
ELSE DC202 END DC202,
CASE WHEN GROUPING(OH002)=1 THEN ''
ELSE DD203 END DD203,
CASE
WHEN GROUPING(DC201)=1 THEN '总计:'
WHEN GROUPING(DC202)=1 THEN '合计:'
WHEN GROUPING(DD203)=1 THEN '合计:'
WHEN GROUPING(DC211)=1 THEN '小计:'
WHEN GROUPING(OH001)=1 THEN '小计:'
WHEN GROUPING(OH002)=1 THEN '小计:'
ELSE DC211 END DC211,
CASE WHEN GROUPING(OH002)=1 THEN ''
ELSE OH001 END OH001,
CASE WHEN GROUPING(OH002)=1 THEN ''
ELSE OH002 END OH002,
SUM(OH008) OH008,
SUM(OH035+OH036) OH035036,
SUM(OH204) OH204,
SUM((OH035+OH036)*(
CASE OH008
WHEN 0 THEN 0
ELSE OH042/OH008 END)*(
CASE OH042
WHEN 0 THEN 0
ELSE OH204/OH042 END)) OH0351,
SUM(OH008-OH042-OH204) OH008042204,
SUM(OH035+OH036-(OH035+OH036)*(
CASE OH008
WHEN 0 THEN 0
ELSE OH042/OH008 END)*(
CASE OH042
WHEN 0 THEN 0
ELSE OH204/OH042 END)) OH0352,
SUM(ISNULL(OA029,0)) OA029,
SUM(ISNULL(OA031,0)) OA031,
SUM(ISNULL(OA029,0)-ISNULL(OA031,0)) OA029031
FROM FGMDC
INNER JOIN FGMDD ON DC201=DD201 AND DC202=DD202
LEFT JOIN BVMOH ON OH001=DD205 AND OH002=DD206 AND OH003=DD207
LEFT JOIN BVMOG ON OH001=OG001 AND OH002=OG002
LEFT JOIN FGMOB ON OB005=OH001 AND OB006=OH002 AND OB007=OH003
LEFT JOIN FGMOA ON OB001=OA001 AND OB002=OA002
LEFT JOIN FGMOD ON OD006=OB001 AND OD007=OB002
LEFT JOIN FGMOC ON OD001=OC001 AND OD002=OC002
GROUP BY DC201,DC202,DD203,DC211,OH001,OH002 WITH ROLLUP
) A
LEFT JOIN FGMDC ON A.DC201=FGMDC.DC201 AND A.DC202=FGMDC.DC202

现在问题来了,内层查询排序都正常。但嵌套一个外联接后的整个语句顺序就乱得一塌糊涂,根本不能达到报表显示格式要求
我知道在程序里实现显示格式更容易,但框架已经定死了没办法。请各位高手帮忙想个主意,让外层嵌套联接后顺序不再打乱
谢谢了。
...全文
175 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
row32hahaha 2009-05-30
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 sdhdy 的回复:]
把一个复杂查询的结果放到一个临时表里,而不是嵌套使用,有可能还会提高速度的。
[/Quote]
非常感谢你的解答,分已给。再次感谢所有人给的回复,谢谢
sdhdy 2009-05-30
  • 打赏
  • 举报
回复
把一个复杂查询的结果放到一个临时表里,而不是嵌套使用,有可能还会提高速度的。
sdhdy 2009-05-30
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 row32hahaha 的回复:]
引用 11 楼 sdhdy 的回复:
引用 10 楼 sdhdy 的回复:
把第一个查询的结果,生成一个带自增ID的临时表,然后再把该临时表和FGMDC表做左联接,试试。

当然,要按自增ID排序,试试。

这样做是OK了。但每次运行要生成个临时表然后再drop掉?
[/Quote]
是的,如果你的这些语句是放在一个存储过程里,不用drop也可以。
不要觉得临时表麻烦,其实很有用的。
不同的用户都可以创建相同名称的临时表,并不冲突。
row32hahaha 2009-05-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 sdhdy 的回复:]
引用 10 楼 sdhdy 的回复:
把第一个查询的结果,生成一个带自增ID的临时表,然后再把该临时表和FGMDC表做左联接,试试。

当然,要按自增ID排序,试试。
[/Quote]
这样做是OK了。但每次运行要生成个临时表然后再drop掉?
row32hahaha 2009-05-30
  • 打赏
  • 举报
回复
回8楼,我实在没看出来改了哪里。跟我的代码不是一样么,而且还有个问题。这句SQL在服务器执行长达10秒左右,才不到9w条数据而已
难道是因为联接和with rollup计算量过大导致数据溢出丢失?小弟诚信请教,还望赐教
sdhdy 2009-05-30
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sdhdy 的回复:]
把第一个查询的结果,生成一个带自增ID的临时表,然后再把该临时表和FGMDC表做左联接,试试。
[/Quote]
当然,要按自增ID排序,试试。
sdhdy 2009-05-30
  • 打赏
  • 举报
回复
把第一个查询的结果,生成一个带自增ID的临时表,然后再把该临时表和FGMDC表做左联接,试试。
row32hahaha 2009-05-30
  • 打赏
  • 举报
回复
正确的结果应该是:
前面省略共8w多条,规律应该是以下
0 0 0 0 0 0
0 0 0 0 0 1
0 0 0 0 1 1
0 0 0 1 1 1
0 0 1 1 1 1
0 0 0 0 0 0
0 0 0 0 0 1
0 0 0 0 1 1
0 0 0 1 1 1
0 0 1 1 1 1
0 1 1 1 1 1
1 1 1 1 1 1
我在外层用GROUPING()排序后的结果是or1排完再用or2........or6
结果大相径庭:
同样省略前面只给出最后,规律完全不一样
0 0 1 1 1 1
0 0 1 1 1 1
0 0 1 1 1 1
0 0 1 1 1 1
0 0 1 1 1 1
0 0 1 1 1 1
0 0 1 1 1 1
0 0 1 1 1 1
0 0 1 1 1 1
0 1 1 1 1 1
1 1 1 1 1 1
JonasFeng 2009-05-30
  • 打赏
  • 举报
回复
SELECT DC209,A.* 
FROM (
SELECT
CASE WHEN GROUPING(OH002)=1 THEN ''
ELSE DC201 END DC201,

CASE WHEN GROUPING(OH002)=1 THEN ''
ELSE DC202 END DC202,

CASE WHEN GROUPING(OH002)=1 THEN ''
ELSE DD203 END DD203,

CASE
WHEN GROUPING(DC201)=1 THEN '总计:'
WHEN GROUPING(DC202)=1 THEN '合计:'
WHEN GROUPING(DD203)=1 THEN '合计:'
WHEN GROUPING(DC211)=1 THEN '小计:'
WHEN GROUPING(OH001)=1 THEN '小计:'
WHEN GROUPING(OH002)=1 THEN '小计:'
ELSE DC211 END DC211,

CASE WHEN GROUPING(OH002)=1 THEN ''
ELSE OH001 END OH001,

CASE WHEN GROUPING(OH002)=1 THEN ''
ELSE OH002 END OH002,

SUM(OH008) OH008,
SUM(OH035 + OH036) OH035036,
SUM(OH204) OH204,
SUM((OH035+OH036)*(

CASE OH008
WHEN 0 THEN 0
ELSE OH042/OH008 END)*(
CASE OH042
WHEN 0 THEN 0
ELSE OH204/OH042 END)) OH0351,

SUM(OH008-OH042-OH204) OH008042204,

SUM(OH035+OH036-(OH035+OH036)*(
CASE OH008
WHEN 0 THEN 0
ELSE OH042/OH008 END)*(
CASE OH042
WHEN 0 THEN 0
ELSE OH204/OH042 END)) OH0352,

SUM(ISNULL(OA029,0)) OA029,

SUM(ISNULL(OA031,0)) OA031,

SUM(ISNULL(OA029,0)-ISNULL(OA031,0)) OA029031

FROM FGMDC
INNER JOIN FGMDD ON DC201=DD201 AND DC202=DD202
LEFT JOIN BVMOH ON OH001=DD205 AND OH002=DD206 AND OH003=DD207
LEFT JOIN BVMOG ON OH001=OG001 AND OH002=OG002
LEFT JOIN FGMOB ON OB005=OH001 AND OB006=OH002 AND OB007=OH003
LEFT JOIN FGMOA ON OB001=OA001 AND OB002=OA002
LEFT JOIN FGMOD ON OD006=OB001 AND OD007=OB002
LEFT JOIN FGMOC ON OD001=OC001 AND OD002=OC002
GROUP BY DC201,DC202,DD203,DC211,OH001,OH002 WITH ROLLUP
) A
LEFT JOIN FGMDC ON A.DC201=FGMDC.DC201 AND A.DC202=FGMDC.DC202


这样应该没问题了吧。
-狙击手- 2009-05-30
  • 打赏
  • 举报
回复
SELECT DC209,A.* 
FROM (
SELECT grouping(dc201) as or1,grouping(dc202) as or2,grouping(dc203) as or3,
grouping(dc211) as or4,grouping(dc001) as or5,grouping(dc002) as or6,
CASE WHEN GROUPING(OH002)=1 THEN ''
ELSE DC201 END DC201,
CASE WHEN GROUPING(OH002)=1 THEN ''
ELSE DC202 END DC202,
CASE WHEN GROUPING(OH002)=1 THEN ''
ELSE DD203 END DD203,
CASE
WHEN GROUPING(DC201)=1 THEN '总计:'
WHEN GROUPING(DC202)=1 THEN '合计:'
WHEN GROUPING(DD203)=1 THEN '合计:'
WHEN GROUPING(DC211)=1 THEN '小计:'
WHEN GROUPING(OH001)=1 THEN '小计:'
WHEN GROUPING(OH002)=1 THEN '小计:'
ELSE DC211 END DC211,
CASE WHEN GROUPING(OH002)=1 THEN ''
ELSE OH001 END OH001,
CASE WHEN GROUPING(OH002)=1 THEN ''
ELSE OH002 END OH002,
SUM(OH008) OH008,
SUM(OH035+OH036) OH035036,
SUM(OH204) OH204,
SUM((OH035+OH036)*(
CASE OH008
WHEN 0 THEN 0
ELSE OH042/OH008 END)*(
CASE OH042
WHEN 0 THEN 0
ELSE OH204/OH042 END)) OH0351,
SUM(OH008-OH042-OH204) OH008042204,
SUM(OH035+OH036-(OH035+OH036)*(
CASE OH008
WHEN 0 THEN 0
ELSE OH042/OH008 END)*(
CASE OH042
WHEN 0 THEN 0
ELSE OH204/OH042 END)) OH0352,
SUM(ISNULL(OA029,0)) OA029,
SUM(ISNULL(OA031,0)) OA031,
SUM(ISNULL(OA029,0)-ISNULL(OA031,0)) OA029031
FROM FGMDC
INNER JOIN FGMDD ON DC201=DD201 AND DC202=DD202
LEFT JOIN BVMOH ON OH001=DD205 AND OH002=DD206 AND OH003=DD207
LEFT JOIN BVMOG ON OH001=OG001 AND OH002=OG002
LEFT JOIN FGMOB ON OB005=OH001 AND OB006=OH002 AND OB007=OH003
LEFT JOIN FGMOA ON OB001=OA001 AND OB002=OA002
LEFT JOIN FGMOD ON OD006=OB001 AND OD007=OB002
LEFT JOIN FGMOC ON OD001=OC001 AND OD002=OC002
GROUP BY DC201,DC202,DD203,DC211,OH001,OH002 WITH ROLLUP
) A
LEFT JOIN FGMDC
ON A.DC201=FGMDC.DC201 AND A.DC202=FGMDC.DC202
order by a.or1,a.or2,......

自己调试一下
-狙击手- 2009-05-30
  • 打赏
  • 举报
回复
楼主查一下grouping()

order by grouping (colname) .....
jiangshun 2009-05-30
  • 打赏
  • 举报
回复
楼主最好给些数据
row32hahaha 2009-05-30
  • 打赏
  • 举报
回复
ORDER BY 不行的因为语句运行后显示出来的就跟报表一样,很多汇总栏是空白,空白如果用order by就会被全部排到下面或者上面,而达不到我要
显示格式的要求,例如以下格式:
XX01
20090500038 0001 2301 20090500046 1000.000 19340.00 1000.000000 .000000
小计: 1000.000 19340.00 1000.000000 .000000
小计: 1000.000 19340.00 1000.000000 .000000
小计: 1000.000 19340.00 1000.000000 .000000
合计: 1000.000 19340.00 1000.000000 .000000 XX01
20090500039 0001 100 2301 20090500045 100.000 3465.00 100.000000 .000000
小计: 100.000 3465.00 100.000000 .000000
小计: 100.000 3465.00 100.000000 .000000
小计: 100.000 3465.00 100.000000 .000000
合计: 100.000 3465.00 100.000000 .000000 XX01
20090500040 0001 2301 20090500045 100.000 3465.00 100.000000 .000000
小计: 100.000 3465.00 100.000000 .000000
小计: 100.000 3465.00 100.000000 .000000
小计: 100.000 3465.00 100.000000 .000000
合计: 100.000 3465.00 100.000000 .000000
合计: 152945441.000 2533181600.20 128182828.000000 2160775972.210000
总计: 152945441.000 2533181600.20 128182828.000000 2160775972.210000

要求SQL查询出来就是这种格式,我内层已经实现,可嵌套外层联接顺序就乱了。。。请问谁知道怎么解决打乱顺序的问题
csdyyr 2009-05-30
  • 打赏
  • 举报
回复
加order by ?
row32hahaha 2009-05-30
  • 打赏
  • 举报
回复
汗一个,有人帮帮忙不?在线等呀。急~~~
-狙击手- 2009-05-30
  • 打赏
  • 举报
回复
好长

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧