请教一个困扰很久的SQL实现方法?

[复制链接]
查看11 | 回复9 | 2010-11-15 11:30:37 | 显示全部楼层 |阅读模式
表T数据大概有100万,我想查询出分别满足条件A,B,C的记录,但是A,B,C三个条件不是互斥的,因此不能通过CASE WHEN一次性筛选出所要的记录,有什么办法能够只扫表大表一次就得到所有需要的记录吗?求指点
[ 本帖最后由 lostlu 于 2011-5-4 16:42 编辑 ]
回复

使用道具 举报

千问 | 2010-11-15 11:30:37 | 显示全部楼层
select (case when a the 1 end)x1,(case when b the 1 end)x2,(case when c the 1 end)x3,t.* from t
where a or b or c
回复

使用道具 举报

千问 | 2010-11-15 11:30:37 | 显示全部楼层
原帖由 〇〇 于 2011-5-4 12:13 发表
select (case when a the 1 end)x1,(case when b the 1 end)x2,(case when c the 1 end)x3,t.* from t
where a or b or c

谢谢,这是一种解决方案,不过我不想把每种条件判断放到不同的列中,我想要这样的结果
SELECT ID,SUM(BAL)
FROM
(SELECTCASE WHENATHEN'1'

WHENBTHEN'2'

WHENCTHEN'3'

END AS ID

,T.BAL
FROMT)
GROUP BY ID
问题是用CASE WHEN时ABC条件不是互斥,会漏数据,如果把每种条件判断放到不同的列中需要列转行才能GROUP BY 求和 。
回复

使用道具 举报

千问 | 2010-11-15 11:30:37 | 显示全部楼层
with as 子句可以试试
回复

使用道具 举报

千问 | 2010-11-15 11:30:37 | 显示全部楼层
原帖由 掌柜de 于 2011-5-4 14:59 发表
with as 子句可以试试


with是将表T放到内存中吗?with并不减少扫描表的次数。
WITHdataAS(SELELCT * FROM T),
etl_data AS
(SELECT'm1' AS id,col2 FROM data WHERE 条件A
UNION ALL
SELECT'm2' AS id,col2 FROM data WHERE 条件B
UNION ALL
SELECT'm3' AS id,col2 FROM data WHERE 条件C
)
SELECTid,sum(col2) GROUP BY id
我现在就是用的with,但还是很慢,前两天还只要几分钟,现在又加了10几个条件后,跑了一个小时还没出结果!!
[ 本帖最后由 lostlu 于 2011-5-4 16:09 编辑 ]
回复

使用道具 举报

千问 | 2010-11-15 11:30:37 | 显示全部楼层
知道的朋友帮帮忙啊
回复

使用道具 举报

千问 | 2010-11-15 11:30:37 | 显示全部楼层
select'm1',
sum(case when m1='m1' then ll else 0) v_m1,
'm2' ... v_m2 m3v_m3
(
select
(case when A then m1 else xx) m1 ,
(case when B then m2 else xx) m2,
(case when C then m3 else xx) m3,
sum(value1) ll
from test
where cond A or B or C
group by
(case when A then m1) ,
(case when B then m2) ,
(case when C then m3)
)
最后用insert all转化为行。
回复

使用道具 举报

千问 | 2010-11-15 11:30:37 | 显示全部楼层
原帖由 xgghxkhuang 于 2011-5-4 16:49 发表
select'm1',
sum(case when m1='m1' then ll else 0) v_m1,
'm2' ... v_m2 m3v_m3
(
select
(case when A then m1 else xx) m1 ,
(case when B then m2 else xx) m2,
(case when C then m3 else xx) m3,
sum(value1) ll
from test
where cond A or B or C
group by
(case when A then m1) ,
(case when B then m2) ,
(case when C then m3)
)
最后用insert all转化为行。

这个方法和OO给的方法差不多,都要列转行,能不能筛选数据时满足条件A的记录打标记M1,满足条件B的记录打标记M2,AB条件不互斥,因此有的记录可能既满足条件A又满足条件B,这条记录就得出现两次,但是标记不同。
[ 本帖最后由 lostlu 于 2011-5-4 17:46 编辑 ]
回复

使用道具 举报

千问 | 2010-11-15 11:30:37 | 显示全部楼层
给楼主回了PM才看到这帖,在五楼的WITH里面加上WHERE A OR B OR C条件看看效果如何。
回复

使用道具 举报

千问 | 2010-11-15 11:30:37 | 显示全部楼层
原帖由 lostlu 于 2011-5-4 14:11 发表

谢谢,这是一种解决方案,不过我不想把每种条件判断放到不同的列中,我想要这样的结果
SELECT ID,SUM(BAL)
FROM
(SELECTCASE WHENATHEN'1'

WHENBTHEN'2'

WHENCTHEN'3'

END AS ID

,T.BAL
FROMT)
GROUP BY ID
问题是用CASE WHEN时ABC条件不是互斥,会漏数据,如果把每种条件判断放到不同的列中需要列转行才能GROUP BY 求和 。


这种解决方法和你要的结果不冲突吧?sum(x+y+z)不就行了?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行