2016-08-16 44 views
0

我查询,并与下面的示例数据SQL服务器GROUP BY大于

SELECT tb1.ID , 
     tb2.TypeID , 
     tb2.Name 
FROM tb1 
     INNER JOIN tb2 ON tb1.ID = tb2.ID 
WHERE tb1.Status = 1 
GROUP BY tb1.ID , 
     tb2.TypeID , 
     tb2.Name 

ID | TypeID | Name| 
====================== 
11 | 1  | A | 
19 | 1  | A | 
10 | 2  | A | 
5 | 1  | B | 
4 | 2  | B | 
20 | 1  | C | 
21 | 1  | C | 

表我想创建一个查询,示出了为每个不同的TYPEID +名称超过1,例如在ID

ID | 
===== 
11 | 
19 | 
20 | 
21 | 

任何人都可以给我一点帮助吗?谢谢。

+0

但在你的例子中没有5或4?所提供的逻辑也需要aB和2 B。 – Whencesoever

+0

@JanWalczak - 因为'(TypeID,Name)'combination'(1,A)'不止一次出现,所以我们得到11和19.因为'(1,C)'出现了多次,所以我们得到了20和21这两列的其他组合不会再出现一次以上。 –

+0

是的,我的错误,你需要那些不止一次的使用。 – Whencesoever

回答

0

尝试这样,

SELECT tb1.ID 
FROM tb1 
INNER JOIN tb2 ON tb1.ID = tb2.ID 
INNER JOIN (
    SELECT tb2.TypeID 
     ,tb2.NAME 
    FROM tb1 
    INNER JOIN tb2 ON tb1.ID = tb2.ID 
    WHERE tb1.STATUS = 1 
    GROUP BY tb2.TypeID 
     ,tb2.NAME 
    HAVING COUNT(*) > 1 
    ) tb3 ON tb3.typeid = tb2.typeid 
    AND tb3.NAME = tb2.NAME 
WHERE tb1.STATUS = 1 
+0

它的工作原理。感谢您的答案。真的很有帮助 – ThaiBM

0

您将需要一个子查询,将选择由这两个领域的分组和分组后有2多发生的所有记录。

SELECT tb1.ID FROM tb1 INNER JOIN tb2 ON tb1.ID = tb2.ID INNER JOIN (
    SELECT tb2.TypeID ,tb2.name FROM tb1 
    INNER JOIN tb2 ON tb1.ID = tb2.ID WHERE tb1.status = 1 
    GROUP BY tb2.TypeID ,tb2.name HAVING COUNT(*) > 1 
    ) temp ON temp.typeid = tb2.typeid 
    AND temp.name = tb2.Name 
WHERE tb1.status = 1 
+1

Nóhoạtđộng。 cảmơnchocâutrảlời。 – ThaiBM