помогите написать sql запрос

YUAL

есть таблица грубо говоря с 2 столбцами (на самом деле больше но не суть) - group_id и type.
group_id может принимать значение от 1 до приблизительно 100 и null
type - принимает 3 значения - type_1, type_2, type_3 не null
Мне надо получить вывод вида
+----------+----------+----------+----------+
| group_id | type_1 | type_2 | type3 |
+----------+----------+----------+----------+
| NULL | 1017463 | 1017463 | 1017463 |
| 5 | 100 | 100 | 100 |
| 11 | 108 | 108 | 108 |
| 12 | 1 | 1 | 1 |
| 13 | 2 | 2 | 2 |
| 15 | 661 | 661 | 661 |
| 17 | 8 | 8 | 8 |
| 21 | 7 | 7 | 7 |

где цифры в 2-4 столбцах это количество записей с таким group_id и таким типом.
Реально ли это сделать на голом sql или надо приделывать какой-то обработчик на скриптовом языке?

avvokado

Можно же тупо SUM(case when type = type_n then 1 else 0 end не?

YUAL

Да - спасибо.

Plok2008

Ну да, попробовать 3 селекта с таким SUM которые дважды OUTER JOIN'ить в одном запросе. По моему, должно сработать.
EDT: хотя это, похоже, оверкилл. Может и единственного селекта с 3 суммами и хватит.

YUAL

зачем? просто через запятую их указать.

avvokado

какие три селекта? :)
Топикстартер понял, вроде, три поля выводить как сумма через кейс, а группировать по первому полю. Никаких джойнов, 1 запрос

kill-still

Ну зачем вы потакаете человеку и учите бяку делать?
Данное решение не обладает масштабируемостью.
Имхо, единственно верным решением будет в данном случае сделать два запроса:

SELECT DISTINCT type
FROM yourTable;

SELECT group_id, type, count(*)
FROM yourTable
GROUP BY group_id, type;
А потом программно денормализовать результат.
Как это примерно делается - можно посмотреть например тут: http://github.com/pentaho/pentaho-kettle/blob/master/engine...
fieldNrs - порядковый номер поля с со значением, по которому идёт денормализация (у тебя это type).
groupnrs - порядковые номера полей, которые составляют ключ (у тебя это только group_id)

kill-still

Ты, кстати, не указал какой диалект сиквела тебя интересует.
Например на MySQL такой запрос, как мороз предлагает, можно сделать за один проход таблицы.

YUAL

Как это сделать не на голом sql я и сам понимаю, но это существенно одноразовая поделка на баше и занимается денормализацией её на баше я не очень горю желанием.

YUAL

Например на MySQL такой запрос, как мороз предлагает, можно сделать за один проход таблицы.
у меня мускуль 5.0, а как?

kill-still

Забей. Если у тебя скрипт на баше, тебе этого знать не надо.

uncle17

Забей. Если у тебя скрипт на баше, тебе этого знать не надо
какая связь?

kill-still

Слишком долго разбираться как это сделать. Вариант мороза проще и универсальнее.

uncle17

поэл, согласен

nawok

погугли mysql pivot

kill-still

ты похоже попутал MySQL и MsSQL(transact)

Bibi

масштабируемость — это кое-что другое. ты, наверное, имел в виду расширяемость.

kill-still

ну, ты понял. :)

avvokado

Затем, что человек попросил именно SQL скрипт. Один, без наворотов. Не всегда надо из пушки по воробьям стрелять, хотя в целом твой подход также верен

hprt

писать таблицы через запятую очень плохо

psm-home

почему?

hprt

1. Нечитаемо, особенно, если человек приходит из другого диалекта сиквела
2. Не во всех диалектах поддерживается (Upd: я имею в виду, outer join)
3. В оракле, скажем, где это больше всего практикуется, сам оракл не рекомендует этим пользоваться и вроде как вообще хотят отказаться от возможности
4. из разряда сам дурак, конечно - не поставил плюсик, и джойн получился совсем другой. А забыл условие случайно - вообще беда. Когда пишешь через джойны от этого застрахован

YUAL

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

hprt

я отвечал на
зачем? просто через запятую их указать.

YUAL

имелось ввиду SUM(case when type = 'type_1' then 1 else 0 end SUM(case when type = 'type_2' then 1 else 0 end SUM(case when type = 'type_3' then 1 else 0 end)

psm-home

1. Нечитаемо, особенно, если человек приходит из другого диалекта сиквела
2. Не во всех диалектах поддерживается (Upd: я имею в виду, outer join)
3. В оракле, скажем, где это больше всего практикуется, сам оракл не рекомендует этим пользоваться и вроде как вообще хотят отказаться от возможности
4. из разряда сам дурак, конечно - не поставил плюсик, и джойн получился совсем другой. А забыл условие случайно - вообще беда. Когда пишешь через джойны от этого застрахован
Я по твоему ответу не понял, что ты про именно про внешнее соединение. По мне так implicit (inner) join через запятую штука стандартная и для несложных и ad hoc запросов вполне ок. Понятно, что когда у тебя становится много таблиц, надо писать явно.

hprt

left join или (+)=

SergeRRRRRR

соединение плюсами в where это ужас-ужас, сразу выдает старпера, работавшего с ораклей еще со времен царя гороха.

psm-home

Какие плюсы в where? Я писал про внутреннее соединение.

hprt

ок, но для чего писать по-разному внутреннее и внешнее? А если логика поменяется - переписывать?

kill-still

В смысле какие? Такие:

SELECT *
FROM main m,
secondary s
WRE m.id = s.main_id(+)

psm-home

Ой спасибо за просвещение. Я писал
implicit (inner) join через запятую штука стандартная и для несложных и ad hoc запросов вполне ок

Т. я я имею в виду, что когда надо быстренько посмотреть что-то в БД, то я не пишу inner join, а пишу таблицы через запятую, это совершенно стандартный и законный способ.
Про оракловые плюcики и MS SQL-ные звездочки я знаю конечно, но сам не пишу, нахера козе баян.

hprt

MS SQL-ные звездочки
:) не поддерживается уже ооочень давно. Если не ошибаюсь, последняя версия - 7.0, максимум 2000

psm-home

прикольно, а Oracle тащат старый синтаксис до сих пор

Boris1980

Нужно транспонировать результат после группировки по полям group_id и type ?
Посмотри в сторону PIVOT. Очень удобно.
Оставить комментарий
Имя или ник:
Комментарий: