2017-01-14 6 views
0

Мне нужно группировать столбцы пользователей в соответствии с диапазонами заданного года. Это примерные диапазоны года (1980-1989-1990-1999,2000-2009) И тогда мне нужно присоединиться, чтобы подсчитать результаты из другой таблицы. Я создал базу данных «user_relations», и я создал две таблицы, чтобы показать свою проблему.SQL Как группировать столбец для заданного диапазона и присоединяться к другой таблице для подсчета связанных строк с первым столбцом

+--------------------------+ 
| Tables_in_user_relations | 
+--------------------------+ 
| user_answers    | 
| users     | 
+--------------------------+ 
2 rows in set (0.00 sec) 

И это пользователи таблица

+----+----------+-----------+ 
| id | username | birthyear | 
+----+----------+-----------+ 
| 1 | user1 |  1980 | 
| 2 | user2 |  1990 | 
| 3 | user3 |  2000 | 
| 4 | user4 |  1983 | 
+----+----------+-----------+ 
4 rows in set (0.00 sec) 

и это user_answers стол. Мне просто нужно подсчитывать user_answers в соответствии с пользователями, которые сгруппированы по диапазону дат.

+----+---------+-----------+ 
| id | user_id | option_id | 
+----+---------+-----------+ 
| 1 |  1 |   1 | 
| 2 |  2 |   1 | 
| 3 |  3 |   2 | 
| 4 |  4 |   1 | 
+----+---------+-----------+ 
4 rows in set (0.00 sec) 

В соответствии с этими таблицами мне нужно получить результат примерно так.

+------------------------------------------------ 
| option_id | 1980-1989 | 1990-1999 | 2000-2009 | 
+------------------------------------------------ 
| 1  |   2 |   1 |   0 | 
| 2  |   0 |   0 |   1 | 
| 3  |   0 |   0 |   0 | 
+------------------------------------------------ 

Примечание: Мне нужно сначала использовать таблицу пользователей. Я знаю, что для получения этих результатов может быть много вариантов. Но я должен получить результат таким образом. Это просто пример.

Я надеюсь, что кто-то там помогает мне. Спасибо.

+0

Является ли это MySQL или PostgreSQL? – Anand

+0

это postgresql –

ответ

3

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

select ua.option_id, 
     sum(case when u.birthyear between 1980 and 1989 then 1 else 0 end) as "1980-1989", 
     sum(case when u.birthyear between 1990 and 1999 then 1 else 0 end) as "1990-1999", 
     sum(case when u.birthyear between 2000 and 2009 then 1 else 0 end) as "2000-2009" 
from users as u 
inner join user_answers as ua 
on  ua.user_id = u.id 
group by ua.option_id 
+0

BTW, скобки сквайра - это синтаксис MS SQL Server. Стандарт SQL и большинство СУБД (включая PostgreSQL) используют двойные кавычки. – Abelisto

+0

@Abelisto, спасибо, приятно знать! – Anand

+0

Большое вам спасибо за ответ отличный ответ. Я хочу задать еще один простой вопрос. fauxmosapien предложил поворот. Какое решение имеет лучшую производительность для больших баз данных? –

1

Вы могли бы сделать это с PIVOT, примерно так:

SELECT * from 
    (SELECT option_id, 
      CASE 
       WHEN birthyear <= 2009 and birthyear >= 2000 THEN '2000-2009' 
       WHEN birthyear <= 1999 and birthyear >= 1990 THEN '1990-1999' 
       WHEN birthyear <= 1989 and birthyear >= 1980 THEN '1980-1989' 
--    [.... etc etc] 
      END as ranges, 
      1 as Responses 
    FROM users u 
    INNER JOIN user_answers ua on u.id = ua.userid) source 
    PIVOT (sum(responses) for ranges in ([2000-2009], [1990-1999],[1980-1989])) as Pivot 
+0

Большое вам спасибо за ответ. Я проверю это сейчас. –

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

  • Нет связанных вопросов^_^