powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как воткнуть case в запрос?
25 сообщений из 32, страница 1 из 2
Как воткнуть case в запрос?
    #39949969
Murmakil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Надо найти для производителя и модели максимальную цену.

Код: sql
1.
2.
3.
4.
Select product.maker, pc.model, max(pc.price) as m_price
from product, pc
where product.model=pc.model
group by product.maker, pc.model



И все бы хорошо, если бы не условие, которое гласит, что цена null, то пусть null и выведет. В ином случае- вывести максимальную цену.
Код: sql
1.
case when pc.price is not null then max(pc.price) end as m_price


При попытке вставить данную строку в селект вылезает ошибка, требующая добавить данную строку и в group by. Но в таком случае интерпретатор просто выводит все строки.
...
Рейтинг: 0 / 0
Как воткнуть case в запрос?
    #39949976
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Murmakil
И все бы хорошо, если бы не условие, которое гласит, что цена null, то пусть null и выведет.

Что выводит max, если цена null?
...
Рейтинг: 0 / 0
Как воткнуть case в запрос?
    #39949977
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Murmakil,

И при чём тут форум "Вакансии"?
...
Рейтинг: 0 / 0
Как воткнуть case в запрос?
    #39949982
Murmakil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg, да голова занята запросом. проглядел =)
...
Рейтинг: 0 / 0
Как воткнуть case в запрос?
    #39949983
Murmakil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadman, на самом деле значений null в таблице нет. Это просто такой изощренный способ поиздеваться
...
Рейтинг: 0 / 0
Как воткнуть case в запрос?
    #39949986
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Murmakil

Код: sql
1.
case when pc.price is not null then max(pc.price) end as m_price


При попытке вставить данную строку в селект вылезает ошибка, требующая добавить данную строку и в group by. Но в таком случае интерпретатор просто выводит все строки.


Вы сами-то понимаете что хотите?
Есть два товара по производителю и модели - один стоит 100 рублей, а второй NULL.
Вам нужно вывести 100 рублей или NULL?

Удивляюсь, то скуль нас нахрен не послал
...
Рейтинг: 0 / 0
Как воткнуть case в запрос?
    #39949992
Murmakil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SQL2008, если null, то так и вывести null.
...
Рейтинг: 0 / 0
Как воткнуть case в запрос?
    #39950002
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Murmakil,

ничего не понял.
вот описание МАХ()

При выполнении функции MAX все значения NULL пропускаются.
MAX возвращает NULL, если нет строк для выбора.


Т.е. если NULL присутствует и является единственным, то NULL и выведется

Пример:
натравливаем запрос

Select product.maker, pc.model, max(pc.price) as m_price
from product, pc
where product.model=pc.model
group by product.maker, pc.model

результат

maker model m_price
B 1121 850,00
A 1232 600,00
A 1233 980,00
E 1260 350,00
B 1261 NULL
...
Рейтинг: 0 / 0
Как воткнуть case в запрос?
    #39950007
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Murmakil
SQL2008, если null, то так и вывести null.

Т.е. если есть хоть одна цена NULL, то уже не ищем макимальную, а выводим NULL?
...
Рейтинг: 0 / 0
Как воткнуть case в запрос?
    #39950035
Murmakil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SQL2008,
нет. если в строке есть null, то просто вывести эту строку как есть
...
Рейтинг: 0 / 0
Как воткнуть case в запрос?
    #39950037
Murmakil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
godsql, вот условие, прям скопировал.
если среди цен на продукцию данного производителя присутствует NULL, то выводить для этого производителя NULL,
иначе максимальную цену
...
Рейтинг: 0 / 0
Как воткнуть case в запрос?
    #39950055
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Murmakil,

я так понимаю, что это задача с http://www.sql-ex.ru/?
дайте номер задачи
...
Рейтинг: 0 / 0
Как воткнуть case в запрос?
    #39950063
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Murmakil,

загоняй case под max. Или вместо case проще использовать iif. Кстати, версия сервака играет роль? Что за сервак?

Модератор: Тема перенесена из форума "Вакансии".
...
Рейтинг: 0 / 0
Как воткнуть case в запрос?
    #39950074
Murmakil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
godsql,
именно. задача 41. Причем мой код выдает верные результаты, но ответ не засчитывается. Полагаю, из-за того, что не вписал это условие
...
Рейтинг: 0 / 0
Как воткнуть case в запрос?
    #39950099
Murmakil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KreatorXXI, добавил в селект max(case when m_price is not null then m_price end) as m_price. Все равно не засчитывает, хоть код и выдает нужный результат.
задача с sql-ex. Версию точно не помню
...
Рейтинг: 0 / 0
Как воткнуть case в запрос?
    #39950135
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Murmakil,
х.з., у меня сохранен такой код :)
Не сильно оптимален, но вполне проходит.


with t1 (maker, price) as
(select p.maker, pc.price from Product P
join PC on p.model=pc.model and p.type='PC'
union
select p.maker, L.price from Product P
join Laptop L on p.model=L.model and p.type='Laptop'
union
select p.maker, pr.price from Product P
join Printer Pr on p.model=Pr.model and p.type='Printer')
select t3.maker,
case when not exists (select t2.price from t1 t2 where t2.price is null and t2.maker=t3.maker) then max(t3.price)
else NULL
end
from t1 t3
group by t3.maker
...
Рейтинг: 0 / 0
Как воткнуть case в запрос?
    #39950139
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в общем-то, задача бьется на 3 таблицы: общая производителей, модели и производители, у которых есть модели с null
Поскольку exists работает быстрее всего, проще, для начала, выделить модели с null и найти их производителей, а потом слить с остальными таблицами.
Это будет лучше по производительности, чем у меня раньше
...
Рейтинг: 0 / 0
Как воткнуть case в запрос?
    #39950164
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Murmakil,

попробуй сделать по моему образцу (у меня работает как надо):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select a.priz_spr,
       max (iif ( exists ( select b.id_spr
                            from sprav b
                            where b.priz_spr=a.priz_spr and b.id_spar is null
                          ),
                          null,
                          a.id_spar
                 )
       )
from sprav a
where a.priz_spr>50
group by 1


Если очень нужен case, поставь case.
...
Рейтинг: 0 / 0
Как воткнуть case в запрос?
    #39950166
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Murmakil,

просто загнать case под max ничего не даст.
...
Рейтинг: 0 / 0
Как воткнуть case в запрос?
    #39950314
Murmakil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
godsql, вот мое решение. есть идеи почему система не засчитывает ответ, хоть он и правильный?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
with isayka as (
Select product.maker, pc.model, max(pc.price) as m_price
from product, pc
where product.model=pc.model
group by product.maker, pc.model
union
Select product.maker, laptop.model, max (laptop.price) as m_price
from product, laptop
where product.model=laptop.model
group by product.maker, laptop.model
union
Select product.maker, printer.model, max(printer.price) as m_price
from product, printer
where product.model=printer.model
group by product.maker, printer.model)
select maker, max(case when m_price is not null then m_price end) as m_price
from isayka
group by maker
...
Рейтинг: 0 / 0
Как воткнуть case в запрос?
    #39950354
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Murmakil,
вы неправильно восприняли условия задачи.
Я так понимаю, что "не проходит проверку на дополнительной базе"?
Нужно, если есть модель с price=null, прекращать вычисление Max и вывести Null для этого производителя.
Т.е., если exists (price (model->maker) is null), то maker, m_price=Null
А вы, в max(case when m_price is not null then m_price end) - просто делаете ненужную работу, т.к. Мах сам пропускает "Null".
Я же вам скинул работающий запрос!
Для опытов просто добавьте модель с Null ценой и увидите сами.
должно получиться что-то вроде

maker (Отсутствует имя столбца)
A 1150,00
B NULL
C 970,00
D 400,00
E 350,00
...
Рейтинг: 0 / 0
Как воткнуть case в запрос?
    #39950380
Murmakil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
godsql, ну так я ваш код и скормил системе. другое дело, что попадись мне снова подобная задача и я дурак дураком снова буду. так я правильно понял, что ошибка в том, что case составил неверно?
Код: sql
1.
case when not exists (select t2.price from t1 t2 where t2.price is null and t2.maker=t3.maker) then max(t3.price)

а зачем создавать аж 3 копии таблицы?
...
Рейтинг: 0 / 0
Как воткнуть case в запрос?
    #39950394
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Murmakil,

нет, логика неправильная
вы сначала вычисляете МАх по всем моделям (игнорируя наличие null), а case вообще делает ненужные движения и max(case) покажет Null только если у данного производителя отсутствуют модели
я же вам написал, как доработать.
...
Рейтинг: 0 / 0
Как воткнуть case в запрос?
    #39950398
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Murmakil
godsql, ну так я ваш код и скормил системе. другое дело, что попадись мне снова подобная задача и я дурак дураком снова буду. так я правильно понял, что ошибка в том, что case составил неверно?
Код: sql
1.
case when not exists (select t2.price from t1 t2 where t2.price is null and t2.maker=t3.maker) then max(t3.price)

а зачем создавать аж 3 копии таблицы?

не помню :)
я ж говорю - не оптимизирован код :)

Кстати, вот этот case и делает то самое, что вы пытались запихнуть под max
...
Рейтинг: 0 / 0
Как воткнуть case в запрос?
    #39950450
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
Murmakil,

И при чём тут форум "Вакансии"?


Похоже навеяло названием "Как воткнуть"
...
Рейтинг: 0 / 0
25 сообщений из 32, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как воткнуть case в запрос?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]