2016-08-23 2 views
0

Я ожидаю результат, имеющий счет в 2 разных столбцах значенияSql запрос для получения группы по на 2 колонки

Name | fruits 
---------------- 
Vishal | orange 
Manish | orange 
Vishal | apple 
Manish | orange 
Manish | apple 
Vishal | orange 
Vishal | mango 
Vishal | banana 

Результат должен быть

Name | Orange count | Apple count| mango | banana 
-------------------------- 
Vishal | 2 | 1 | 1 | 1 
Manish | 2 | 1 | 0 | 0 

Другой результат должен быть

name | fruits 
--------------- 
Vishal | orange, Apple , mango, banana 
Manish | orange , Apple 
+0

Какого СУБДА вы используете? –

+0

Каков ожидаемый результат, если в таблице вдруг появится ананас? – jarlh

+0

Да! Хороший плод - это, в основном, своего рода категория, которая исправлена. Если появляется новая категория, я должен пойти и изменить запрос, и это нормально. Вторая часть зависит в это время, когда я делаю предварительный тест в базе данных ACcess, и в производстве это может быть MS Sql или oracle 11g. Но наверняка это не может ничего, кроме этих трех баз данных. – connect2vishal

ответ

0

Ниже приведен общий сводный запрос, который должен работать в большинстве СУБД:

SELECT Name, 
     SUM(CASE WHEN fruits = 'orange' THEN 1 ELSE 0 END) AS orange_count, 
     SUM(CASE WHEN fruits = 'apple' THEN 1 ELSE 0 END) AS apple_count, 
     SUM(CASE WHEN fruits = 'mango' THEN 1 ELSE 0 END) AS mango_count, 
     SUM(CASE WHEN fruits = 'banana' THEN 1 ELSE 0 END) AS banana_count 
FROM yourTable 
GROUP BY Name 

Если вы используете SQL Server, Oracle или Postgres, есть встроенные функции PIVOT, которые могут упростить это и, возможно, повысить производительность.

0

Вы можете использовать условную агрегацию для этого:

select name, 
     count(case when fruits = 'orange' then 1 end) as orange_count, 
     count(case when fruits = 'apple' then 1 end) as apple_count, 
     count(case when fruits = 'mango' then 1 end) as mango_count, 
     count(case when fruits = 'banana' then 1 end) as banana_count 
from the_table 
group by name; 

Некоторой СУБД также поддерживает filter пункт ANSI SQL, который делает это немного более удобным для чтения:

select name, 
     count(*) filter (where fruits = 'orange') as orange_count, 
     count(*) filter (where fruits = 'apple') as apple_count, 
     count(*) filter (where fruits = 'mango') as mango_count, 
     count(*) filter (where fruits = 'banana') as banana_count 
from the_table 
group by name; 
Смежные вопросы