如何组合两个不存在的sql?

时间:2016-01-22 03:43:35

标签: mysql

我怀疑解决问题是对的。

TEST_TABLE:

id       |  name   |  value  |  date
---------|---------|---------|------------
1        |  john   |    32   |  2016-01-08
2        |  tom    |    590  |  2016-01-03
3        |  king   |    1903 |  2016-01-01
4        |  john   |    490  |  2016-01-02
5        |  gary   |    58   |  2016-01-18
6        |  cat    |    5    |  2016-01-10

SQL1:

select name,sum(value) as val from test_table where val > 500 group by name;

SQL2:

select name from test_table where  date >= DATE_SUB(CURDATE(),INTERVAL 1 WEEK) group by name;

我想将两个sql合二为一。 sql2名称结果集合中不存在sql结果名称。

更新

抱歉,我很困惑。

sql1扫描整个表,它的目的是找出谁的总值大于500.

sql2扫描了上周的数据,以确定上周是谁。

所以,我想结合两个sql,找出那些总价值大于500但上周不存在的人。

再次抱歉我的英语不好。

更新 - 添加示例:

就像表格内容一样,结果应该是:

约翰,汤姆,王

因为他们的总价值是> 500,但不是上周更新

但我怎么能这样做。

谢谢大家。

2 个答案:

答案 0 :(得分:1)

SELECT name, sum(value)
FROM test_table
WHERE value > 500
AND name NOT IN (
    SELECT name
    FROM test_table
    WHERE `date` >= DATE_SUB(CURDATE(), INTERVAL 1 WEEK)
)
GROUP BY 1

OR

SELECT name, sum(value)
FROM test_table
WHERE value > 500
GROUP BY 1
HAVING max(`date') < DATE_SUB(CURDATE(), INTERVAL 1 WEEK)

如果你想要总和(价值)&gt; 500,删除上面的行

WHERE value > 500

AND 更改为第一个SQL的 WHERE

并在上述每一行的末尾添加此行:

having sum(value) > 500

答案 1 :(得分:0)

描述您想要的内容以及提供SQL示例非常有用。对于过去一周没有日期行的名称,您似乎希望值的总和大于500。

如果是这样的话:

select name, sum(case when value > 500 then value else 0 end)
from test_table
where value > 500
group by name
having max(date) < DATE_SUB(CURDATE(), INTERVAL 1 WEEK) ;