我怀疑解决问题是对的。
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,但不是上周更新
但我怎么能这样做。
谢谢大家。
答案 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) ;