2016-01-22 45 views
1

我怀疑是否可以解决问题。如何将两个sql与不存在相结合?

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

你想在这一行说什么 - > SQL结果名称不存在于SQL2名称结果集合。 –

+0

@VigneswaranS这意味着sql结果中不存在sql结果。我想找出谁没有更新lastweek,但他的价值是大于500.谢谢,问题描述已经更新 – iameven

回答

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) 

如果你想有总和(值)> 500,删除上述行

WHERE value > 500 

而变化WHERE第一个SQL

,并在每个以上的末尾添加下面一行:

having sum(value) > 500 
+0

谢谢你的回答,但你的SQL结果是找出用户上周之前谁的价值超过500。但我只想在上周之前找出谁存在。 – iameven

+0

我简化了你的问题,我认为我的解决方案与你请求的 – SIDU

+0

完全一样,我刚刚添加了这个例子,对于我的表格内容,结果应该是john,tom,king,但是你的sql结果只是tom和king。所以,我希望上周没有更新的人员,而不是上个星期值> 500且不更新的人员。 – iameven

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) ; 
+0

谢谢你的回答,更新descibe – iameven