我有2个查询!
select LINE, ACCOUNT
from DATAS
where date between "2015-07-01" and "2015-07-15"
and SIG="in"
group by ACCOUNT
order by ACCOUNT
和
select LINE, ACCOUNT
from DATAS
where date between "2015-07-01" and "2015-07-15"
and SIG="out"
group by ACCOUNT
order by ACCOUNT
示例结果:
LINE-ACCOUNT, SIG
0-1309 IN
0-1331 IN
0-1340 IN
0-1361 IN
0-1404 IN
0-1555 IN
LINE-ACCOUNT, SIG
0-1098 OUT
0-1309 OUT
0-1322 OUT
0-1331 OUT
0-1340 OUT
0-1555 OUT
我想要2个会产生结果的查询:
我在excel中解决了它,但是它太复杂了,无法解决它日复一日! ;)
如果更容易我也接受php中的解决方案!
我希望你明白我的意思!
提前致谢
答案 0 :(得分:0)
你尝试过这样的事吗?
select * from
(
(select LINE, ACCOUNT, SIG
from DATAS
where date between "2015-07-01" and "2015-07-15"
and SIG="in"
group by ACCOUNT
order by ACCOUNT)
union all
(select LINE, ACCOUNT, SIG
from DATAS
where date between "2015-07-01" and "2015-07-15"
and SIG="out"
group by ACCOUNT
order by ACCOUNT)
) t1
group by LINE, ACCOUNT
having count(Line) = 1
编辑:更正了查询
编辑:这里是关于查询如何工作的简要说明。首先,我们选择SIG =' IN' ...然后我们追加SIG =' OUT'。
的所有行。现在是它变得有趣的地方。如果一行同时具有IN和OUT语句,它将在我们当前的结果集中出现两次,因为它将成为SIG =" IN"的一部分。和SIG =" OUT"查询。另一方面,只有一个" IN"或者" OUT"只会出现在两个内部查询之一中。我们将利用这一点。
外部选择语句及其"组由LINE,ACCOUNT"声明展平我们的结果集,从而允许我们使用count()函数。如果两个查询中都出现一行,则count()将等于2 ...另一方面,如果一行只出现在两个查询之一中,则count()将等于1。这些是我们想要的。
但是,在SQL中,你无法做到:
select * from table where count() > 1
如果要使用聚合函数放置条件,则必须使用"使用"条款,放在"组后面的"声明和行为完全类似于"其中",只有聚合函数。