求大神帮忙,现有tabel_X、tabel_Y、tabel_T三张表,求查询结果为result_1和result_2的SQL语句,跪谢!

如题所述

select d.cpdm,sum(case when d.dm='A' then 1 else 0 end) num, sum(case when d.dm='A' then d.zl end) zl_a,sum(case when d.dm='B' then d.zl end) zl_b,sum(case when d.dm='C' then d.zl end) zl_c,sum(case when d.dm='D' then d.zl end) zl_d from
(select a.cpdm,case when a.id=b.x_id then b.dm else c.dm end dm,case when a.id=b.x_id then b.zl else c.zl end zl
from table_t a,table_x b,table_y c where a.tp=1 and (a.id=b.x_id or a.id=c.y_id)) d group by d.cpdm,d.dm
我没有环境测试,这样的两层可能能行。如果不行,那么就把sum这些放到第三层,第二层就是用
d.cpdm,d.dm分组计算出每一个的count值和每个dm的zl,
大概意思是
select d.cpdm,d.dm,count(*) num,sum(d.zl) zl from
(select a.cpdm,case when a.id=b.x_id then b.dm else c.dm end dm,case when a.id=b.x_id then b.zl else c.zl end zl
from table_t a,table_x b,table_y c where a.tp=1 and (a.id=b.x_id or a.id=c.y_id)) d group by d.cpdm,d.dm
然后在用case when 并且用cpdm分组,一定可以的。
只不过我觉得直接写两层好像也可以,所以就这么写了。不行就用下面的三层嵌套。
tp=1和tp=2,我认为是你要输入的参数,如果是一次出来,可能还要加一个tp的分组。追问

感谢大神热心回复,思路较清晰,但小弟使用帮助测试未通过,另外,我需要结果A,B,C,D分别统计和值放在,请赐教,跪谢!

追答

使用帮助测试未通过?啥意思?
什么叫做结果A,B,C,D分别统计和值放在?啥意思?
我是按照你给的结果写的,一般而言出来的结果应该是和你要的结果类似,就是没有上面的那个ZL,因为数据库粒度没办法改变,所以是ZL_A,zl_b,zl_c,zl_d四个。
再有什么地方没通过?那个子查询,还是后面的查询?说清楚啊,这里没办法测试,只能是你自己测试。所以就要麻烦你说清楚了。

追问

不好意思,测试时提示语句错误,小弟功力尚浅,还望多加指教。多谢!

追答

你直接复制的吧?
select a.cpdm,case when a.id=b.x_id then b.dm else c.dm end dm,case when a.id=b.x_id then b.zl else c.zl end zl
from table_t a,table_x b,table_y c where a.tp=1 and (a.id=b.x_id or a.id=c.y_id)
出来的结果是啥?
如果可以的话,贴出来看看。

追问

代码通过了,但是结果好像不对,麻烦大神再帮我看看。

这是您第一段代码的结果

这是您第二段代码的结果

这是您第三段代码的结果,这里4001共有56个。

烦请大神帮我再研究研究,非常感谢!

追答

TP=1的4001共56个?这其中dm=A的28个,dm=B的多少个,dm=c的呢?d的呢?按照你的给的最终表格看,每个dm(也就是A、B、C、D)的个数应该是一致的吧。有没有不一致的情况?
比如:(这部分最好手查,本来内容就不多可以手查,要是写代码估计内容就更多了)
在tp=1的条件下,dm=A的有28个,dm=B的10个,dm=C的10个,dm=D的8个,你的56个是这个意思么?
还是说等于A的就有56个?
我这里是在是没有环境,你贴的第一张图片,是你要的结果么?还是说什么结果不对。
这样,给你个建议,你不要用你真实的数据做,你就用你给的那三张测试表的数据做,这样我这里能看出问题出在哪里,要怎么去改,而且数据料较小,也好控制。现在你给的跟测试表不一致,我这里也不知道你的确切数据,没办法具体改动。

温馨提示:答案为网友推荐,仅供参考
相似回答