помогите написать sql запрос
Можно же тупо SUM(case when type = type_n then 1 else 0 end не?
Да - спасибо.
EDT: хотя это, похоже, оверкилл. Может и единственного селекта с 3 суммами и хватит.
зачем? просто через запятую их указать.
Топикстартер понял, вроде, три поля выводить как сумма через кейс, а группировать по первому полю. Никаких джойнов, 1 запрос
Данное решение не обладает масштабируемостью.
Имхо, единственно верным решением будет в данном случае сделать два запроса:
А потом программно денормализовать результат.
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)
Например на MySQL такой запрос, как мороз предлагает, можно сделать за один проход таблицы.
Как это сделать не на голом sql я и сам понимаю, но это существенно одноразовая поделка на баше и занимается денормализацией её на баше я не очень горю желанием.
Например на MySQL такой запрос, как мороз предлагает, можно сделать за один проход таблицы.у меня мускуль 5.0, а как?
Забей. Если у тебя скрипт на баше, тебе этого знать не надо.
Забей. Если у тебя скрипт на баше, тебе этого знать не надокакая связь?
Слишком долго разбираться как это сделать. Вариант мороза проще и универсальнее.
поэл, согласен
погугли mysql pivot
ты похоже попутал MySQL и MsSQL(transact)
масштабируемость — это кое-что другое. ты, наверное, имел в виду расширяемость.
ну, ты понял.
Затем, что человек попросил именно SQL скрипт. Один, без наворотов. Не всегда надо из пушки по воробьям стрелять, хотя в целом твой подход также верен
писать таблицы через запятую очень плохо
почему?
2. Не во всех диалектах поддерживается (Upd: я имею в виду, outer join)
3. В оракле, скажем, где это больше всего практикуется, сам оракл не рекомендует этим пользоваться и вроде как вообще хотят отказаться от возможности
4. из разряда сам дурак, конечно - не поставил плюсик, и джойн получился совсем другой. А забыл условие случайно - вообще беда. Когда пишешь через джойны от этого застрахован
писать таблицы через запятую очень плохоа я и не писал. я вообще ничего не джойнил.
зачем? просто через запятую их указать.
имелось ввиду 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)
1. Нечитаемо, особенно, если человек приходит из другого диалекта сиквелаЯ по твоему ответу не понял, что ты про именно про внешнее соединение. По мне так implicit (inner) join через запятую штука стандартная и для несложных и ad hoc запросов вполне ок. Понятно, что когда у тебя становится много таблиц, надо писать явно.
2. Не во всех диалектах поддерживается (Upd: я имею в виду, outer join)
3. В оракле, скажем, где это больше всего практикуется, сам оракл не рекомендует этим пользоваться и вроде как вообще хотят отказаться от возможности
4. из разряда сам дурак, конечно - не поставил плюсик, и джойн получился совсем другой. А забыл условие случайно - вообще беда. Когда пишешь через джойны от этого застрахован
left join или (+)=
соединение плюсами в where это ужас-ужас, сразу выдает старпера, работавшего с ораклей еще со времен царя гороха.
Какие плюсы в where? Я писал про внутреннее соединение.
ок, но для чего писать по-разному внутреннее и внешнее? А если логика поменяется - переписывать?
SELECT *
FROM main m,
secondary s
WRE m.id = s.main_id(+)
implicit (inner) join через запятую штука стандартная и для несложных и ad hoc запросов вполне ок
Т. я я имею в виду, что когда надо быстренько посмотреть что-то в БД, то я не пишу inner join, а пишу таблицы через запятую, это совершенно стандартный и законный способ.
Про оракловые плюcики и MS SQL-ные звездочки я знаю конечно, но сам не пишу, нахера козе баян.
MS SQL-ные звездочкине поддерживается уже ооочень давно. Если не ошибаюсь, последняя версия - 7.0, максимум 2000
прикольно, а Oracle тащат старый синтаксис до сих пор
Посмотри в сторону PIVOT. Очень удобно.
Оставить комментарий
YUAL
есть таблица грубо говоря с 2 столбцами (на самом деле больше но не суть) - group_id и type.group_id может принимать значение от 1 до приблизительно 100 и null
type - принимает 3 значения - type_1, type_2, type_3 не null
Мне надо получить вывод вида
где цифры в 2-4 столбцах это количество записей с таким group_id и таким типом.
Реально ли это сделать на голом sql или надо приделывать какой-то обработчик на скриптовом языке?