2013-06-22 9 views
2

У нас есть таблица, как это:граф строк, сгруппированных по условию в SQL

+----+--------+ 
| Id | ItemId | 
+----+--------+ 
| 1 | 1100 | 
| 1 | 1101 | 
| 1 | 1102 | 
| 2 | 2001 | 
| 2 | 2002 | 
| 3 | 1101 | 
+----+--------+ 

Мы хотим, чтобы подсчитать, сколько элементов каждый парень, и показать парням с 2-мя или более пунктов. Примерно так:

+----+-----------+ 
| Id | ItemCount | 
+----+-----------+ 
| 1 | 3   | 
| 2 | 2   | 
+----+-----------+ 

Мы не считали парня с Id = 3, потому что у него есть только 1 предмет.

Как мы можем это сделать в SQL?

ответ

3
SELECT id, COUNT(itemId) AS ItemCount 
FROM YourTable 
GROUP BY id 
HAVING COUNT(itemId) > 1 
+0

Я единственный в мире, который предпочитает 'Count (*)> = 2'? – ErikE

1
SELECT id, 
     count(1) 
FROM YOUR_TABLE 
GROUP BY id 
HAVING count(1) > 1; 
+0

Что COUNT (1) означает? –

+0

В Oracle он рассчитывает только один столбец. Это имело значение в Oracle8 (производительность), но теперь это не имеет значения. Конечно, вы можете использовать count (*) или count (itemId). – MiGro

+0

count (1) - это просто привычка, вы можете использовать count (*) или count (-42), это неважно – jazzytomato

0
select Id, count(ItemId) as ItemCount 
    from table_name 
    group by Id 
    having ItemCount > 1 
+0

вы не можете этого сделать. Вы должны фильтровать строки, а затем агрегировать. Но вы пытаетесь сделать фильтр по результату агрегата. Ключевое слово для использования - * HAVING *, взгляните на мой ответ – jazzytomato

1

Используйте этот запрос

SELECT * 
FROM ( 
    SELECT COUNT(ItemId) AS COUNT, Id FROM ITEM 
    GROUP BY Id 
) 

my_select 
WHERE COUNT>1