Cоставлениe sql-запроса, пожалуйста?

Есть таблица, в которой два столбца, один со значениями, другой с их статусами (например: если статус 1, то значение относится к производимой продукции, если статус 2, то значение относится к реализованной продукции). Необходимо, что бы запрос брал значение из первого столбца на основе значения во втором столбце, а на выходе получалось два отдельных столбца с произведенной и реализованной продукцией. Хотелось бы сделать это одним запросом.


Допустим есть запрос:
SELECT value as value1, value as value2, status

необходимо, что бы в зависимости от поля status, данные из поля value попадали либо в value1 либо в value2.
  • Вопрос задан
  • 11179 просмотров
Пригласить эксперта
Ответы на вопрос 5
apangin
@apangin
SELECT IF(status=1, value, NULL) AS value1, IF(status=2, value, NULL) AS value2 FROM table
Ответ написан
sajgak
@sajgak
примерно так
(SELECT value1 FROM table WHERE status = 1) UNION (SELECT value2 FROM table WHERE status = 2)
Написал на скорую руку, могу ошибатся… если скинете дамп данных — помогу точнее:)
Ответ написан
Как я понял вам надо вот что:

SELECT 
    IF(status = 1, value, NULL) AS value1,
    IF(status = 2, NULL, value) AS value2,
    status
FROM table
WHERE 1


Тогда у вас в value1 будет null для всей продукции со статусом 2, а в value2 будет NULL для продукци со статусом 1
Ответ написан
wGG
@wGG Автор вопроса
Приведенные примеры работают, но если ввести ограничение по дате, то все рушится.

Например так:

SELECT
DATE_FORMAT(dtcreate, '%d %M %Y') as dtcreate,
IF(state = 1, sum(plumb), NULL) AS value1,
IF(state = 3, sum(plumb), NULL) AS value2
FROM tblplumb
WHERE 1
GROUP BY DATE_FORMAT(dtcreate, '%d .%m.%Y')


работает, а так:

SELECT
DATE_FORMAT(dtcreate, '%d %M %Y') as dtcreate,
IF(state = 1, sum(plumb), NULL) AS value1,
IF(state = 3, sum(plumb), NULL) AS value2
FROM tblplumb
WHERE dtcreate BETWEEN @start AND @STOP
GROUP BY DATE_FORMAT(dtcreate, '%d .%m.%Y')


уже не работает, и если попробовать вставить ограничение в условие if — тоже не работает.

С вариантом:

SELECT value*(status=1) AS value1, value*(state=2) AS value2 FROM table

та же беда…
Ответ написан
alkash
@alkash
Если для Oracle, то попробуйте так. Если не оракл, то можно вместо CASE использовать DECODE
select
case
when value = 1 then status end value1,
case
when value = 2 then status end value2
from table
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы