powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Sql - запрос
11 сообщений из 11, страница 1 из 1
Sql - запрос
    #33594327
Фотография ponuch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Существует таблица Cens содержащая поля:
Numrec — ID записи;
RodId — ID родительской записи (связь один ко многим);
ItemId — ID товара;
Cena — цена товара;

Поле RodId может принимать 4 значения (1 — закупочный прайс, 2 — оптовый, 3 — мелкооптовый, 4 — розничный).
Нужно сделать один селект, представляющий таблицу Cens в следующем виде:

ItemId — ID товара
Cena1 — цена закупочная или 0 в случае отсутствия цены на товар в закупочном прайсе
Cena2 — то же для оптовой цены;
Cena3 — то же для мелкооптовой цены;
Cena4 — то же для розничной цены;

В таблице несколько записей

Numrec RodId ItemId Cena
1 1 1 10
2 2 1 20
3 1 2 5

Должно получиться:

ItemId Cena1 Cena2 Cena3 Cena4
1 10 20 0 0
2 5 0 0 0
...
Рейтинг: 0 / 0
Sql - запрос
    #33594450
Andres 1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Sql - запрос
    #33594454
Фотография ponuch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Совсем не то. Решаться должно одним запросом.
...
Рейтинг: 0 / 0
Sql - запрос
    #33594456
Andres 1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ponuchСовсем не то. Решаться должно одним запросом.
На любом сервере, одним запросом? Не знаю такого. В MS Jet SQL (Access то есть) есть такая возможность - TRANSFORM :)
...
Рейтинг: 0 / 0
Sql - запрос
    #33594459
-------------
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ponuchСуществует таблица Cens содержащая поля:
Numrec — ID записи;
RodId — ID родительской записи (связь один ко многим);
ItemId — ID товара;
Cena — цена товара;

Поле RodId может принимать 4 значения (1 — закупочный прайс, 2 — оптовый, 3 — мелкооптовый, 4 — розничный).
Нужно сделать один селект, представляющий таблицу Cens в следующем виде:

ItemId — ID товара
Cena1 — цена закупочная или 0 в случае отсутствия цены на товар в закупочном прайсе
Cena2 — то же для оптовой цены;
Cena3 — то же для мелкооптовой цены;
Cena4 — то же для розничной цены;

В таблице несколько записей

Numrec RodId ItemId Cena
1 1 1 10
2 2 1 20
3 1 2 5

Должно получиться:

ItemId Cena1 Cena2 Cena3 Cena4
1 10 20 0 0
2 5 0 0 0


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SELECT
     ItemId, 
     coalesce(cena_1,  0 ) as cena1, 
     coalesce(cena_2,  0 ) as cena2,
     coalesce(cena_3,  0 ) as cena3,
     coalesce(cena_4,  0 ) as cena4
FROM 
  (SELECT DISTINCT itemId FROM cens) as items_t 
    LEFT OUTER JOIN 
  (SELECT itemid, cena as cena_1 FROM Cens WHERE RodID =  1 ) AS rod_1 
  ON (items_t.itemID=rod_1.itemID)
    LEFT OUTER JOIN 
  (SELECT itemid, cena as cena_2 FROM Cens WHERE RodID =  2 ) AS rod_2 
  ON (items_t.itemID=rod_2.itemID)
    LEFT OUTER JOIN 
  (SELECT itemid, cena as cena_3 FROM Cens WHERE RodID =  3 ) AS rod_3 
   ON (items_t.itemID=rod_3.itemID)
    LEFT OUTER JOIN 
  (SELECT itemid, cena as cena_4 FROM Cens WHERE RodID =  4 ) AS rod_4 
  ON (items_t.itemID=rod_4.itemID)
ЗЫ непроверял
...
Рейтинг: 0 / 0
Sql - запрос
    #33594464
-------------
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
SELECT
     ItemId, 
....
читать как
Код: plaintext
1.
2.
3.
SELECT
     items_t.ItemId, 
....
...
Рейтинг: 0 / 0
Sql - запрос
    #33594470
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ponuch
Должно получиться:

ItemId Cena1 Cena2 Cena3 Cena4
1 10 20 0 0
2 5 0 0 0
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT
	ItemID
	, MAX((CASE RodId WHEN  1  THEN Cena END)) AS Cena1
	, MAX((CASE RodId WHEN  2  THEN Cena END)) AS Cena2
	, MAX((CASE RodId WHEN  3  THEN Cena END)) AS Cena3
	, MAX((CASE RodId WHEN  4  THEN Cena END)) AS Cena4
FROM (
	SELECT  1  AS Numrec,  1  AS RodId,  1  AS ItemID,  10  AS Cena
	UNION ALL SELECT  2 ,  2 ,  1 ,  20 
	UNION ALL SELECT  3 ,  1 ,  2 ,  5 
) Cens
GROUP BY ItemID
? NULL в 0, надеюсь, преобразовать сможете...
...
Рейтинг: 0 / 0
Sql - запрос
    #33594515
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что-то все какие-то навороченные варинаты предалагают...

так пойдет?
Код: plaintext
1.
2.
3.
SELECT  greatest(nvl(c1.ItemId, - 1 ), nvl(c2.ItemId, - 1 ), nvl(c3.ItemId, - 1 ), nvl(c4.ItemId, - 1 )) ItemId, c1.Cena Cena1, c2.Cena Cena2, c3.Cena Cena3, c4.Cena Cena4
  FROM ((Cens c1 FULL OUTER JOIN Cens c2 ON c1.ItemId = c2.ItemId) FULL OUTER JOIN Cens c3 ON
        greatest(nvl(c1.ItemId, - 1 ), nvl(c2.ItemId, - 1 )) = c3.ItemId)
  FULL OUTER JOIN Cens c4 ON greatest(nvl(c1.ItemId, - 1 ), nvl(c2.ItemId, - 1 ), nvl(c3.ItemId, - 1 )) = c4.ItemId
при условии, что ItemId все неотрицательные
...
Рейтинг: 0 / 0
Sql - запрос
    #33594773
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что-то я переборщил...
предыдущий вариант лучше переписать так:
Код: plaintext
1.
2.
3.
SELECT  nvl(nvl(c1.ItemId, c2.ItemId), nvl(c3.ItemId, c4.ItemId)) ItemId, c1.Cena Cena1, c2.Cena Cena2, c3.Cena Cena3, c4.Cena Cena4
  FROM ((Cens c1 FULL OUTER JOIN Cens c2 ON c1.ItemId = c2.ItemId)
  FULL OUTER JOIN Cens c3 ON nvl(c1.ItemId, c2.ItemId) = c3.ItemId)
  FULL OUTER JOIN Cens c4 ON nvl(c1.ItemId, nvl(c2.ItemId, c3.ItemId)) = c4.ItemId
так проще и не возникает условие на неотрицательность ItemId
...
Рейтинг: 0 / 0
Sql - запрос
    #33595330
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эта кросстаб. Делать надо на клиенте, например, в Crystall-report.
...
Рейтинг: 0 / 0
Sql - запрос
    #33595753
Фотография ponuch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большое спасибо за ответы. Вот еще рабочий вариант (с RSDN)

select DISTINCT ItemId,
(select sum(Cena) From prices Where ItemId = T.ItemId AND RodId =1 ) as PRICE1,
(SelecT sum(Cena) From PRICES Where ItemId = T.ItemId and RodId =2) as PRICE2,
(SelecT sum(Cena) From PRICES Where ItemId = T.ItemId and RodId =3) as PRICE3,
(SelecT sum(Cena) From PRICES Where ItemId = T.ItemId and RodId =4) as PRICE4
From Cens T

Проверял в IbExpert и еще

select ItemId,
sum(case RodId when 1 then Cena else 0 end) as Cena1,
sum(case RodId when 2 then Cena else 0 end) as Cena2,
sum(case RodId when 3 then Cena else 0 end) as Cena3,
sum(case RodId when 4 then Cena else 0 end) as Cena4
from Cens group by ItemId

тоже рабочий. В общем задача решена всем спасибо!
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Sql - запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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