2016-08-10 2 views
0

У меня есть аналогичная таблица для этого в SQL:SQL: граф различных значений строк в таблице

id |tag | entryID 
---+----+-------- 
1 |foo | 0 
2 |foo | 0 
3 |bar | 3 
5 |bar | 3 
6 |foo | 3 
7 |foo | 3 

Я хочу, чтобы выполнить запрос для подсчета отдельных строк в таблице (с id колонны упала). Результат должен выглядеть так (или транспонирование этой таблицы):

(tag=foo, entryID=0) | (tag=foo, entryID=3) | (tag=bar, entryID=3) 
---------------------+----------------------+--------------------- 
2     | 2     | 2 

В чем должен быть этот запрос?

Примечание: Значения в каждой из столбцов не известны заранее.

+0

Вы пробовали что-нибудь вообще, что вы можете показать нам, чтобы мы начали, или вы просите котировку для работы. – RiggsFolly

+0

. Знаете ли вы значения для тега и записи заранее? Если это так, вы можете использовать «условную агрегацию». Если нет, вам нужно объединить этот подход с 'dynamic sql'. – sgeddes

+0

Похожа на: http://stackoverflow.com/questions/5737628/mysql-count-distinct –

ответ

2

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

select sum(tag = 'foo' and entryId = 0) as "tag=foo, entryID=0", 
     sum(tag = 'foo' and entryId = 3) as "tag=foo, entryID=3", 
     sum(tag = 'bar' and entryId = 3) as "tag=bar, entryID=0" 
from t; 

Однако, нормальный способ поставить счетчики в ряды, а не столбцы:

select tag, entryId, count(*) 
from t 
group by tag, entryId; 

Ряды гораздо более универсален, потому что вам не нужно перечислять каждую комбинацию, которую вы, возможно, захотите сопоставить.

Смежные вопросы