Имя: Пароль:
1C
1C 7.7
v7: Использование Case в запросах SQL 1Cv7.7
0 Lacoster
 
09.04.13
13:36
Добрый день! Не могу допереть до правильного решения.
Есть справочник Цены Номенклатуры. Мне необходимо выдернуть цены на нужную мне номенклатуру в зависимости от типа цен.
т.е. хочу получить примерно такую вот табличку Номенклатура/Цена1(от типа цен1)/Цена2(от типа цен2).
Вот мысли которые мне кажутся верными, но к сожалению не рабочими. Есть идеи?
       ТекстЗапроса =
       |SELECT Цены.ID [Ссылка $Справочник.Цены]
       |    , Цены.ISMARK ПометкаУдаления
       |    , Цены.PARENTEXT [Владелец $Справочник.Номенклатура]
       |    , $Цены.Валюта [Валюта $Справочник.Валюты]
       |    , $ПоследнееЗначение.Цены.Единица(Цены.ID, :ВыбДата) [Единица $Справочник.Единицы]
       |    , $Цены.Процент Процент
       |    , $Цены.ТипЦен [ТипЦен $Справочник.ТипыЦен]
       |    ,  case when (Цены.PARENTEXT = :Номенклатура)
       |                AND ($Цены.ТипЦен = :ТипЦен1~)
       |                then $ПоследнееЗначение.Цены.Цена(Цены.ID, :ВыбДата~~) and Цена1
       |    , case when (Цены.PARENTEXT = :Номенклатура)
       |                AND ($Цены.ТипЦен = :ТипЦен2~)
       |                then $ПоследнееЗначение.Цены.Цена(Цены.ID, :ВыбДата~~) and Цена2
       |FROM $Справочник.Цены AS Цены With (NOLOCK)
1 Ёпрст
 
09.04.13
13:39
Ну, надо как бэ наеборот - выгребать из справочника Номенклатура, джойнить к нему Цены и смотреть уже Последнее значение цены.
2 Ёпрст
 
09.04.13
13:40
А так у тебя не будет Номенклатуры, у которой цены не заданы.
3 Lacoster
 
09.04.13
13:44
у меня Цены Номенклатуры это подчиненный справочник к Номенклатуре.
Вот так работает, но только одна колонка с ценой.
       |SELECT Цены.ID [Ссылка $Справочник.Цены]
       |    , Цены.ISMARK ПометкаУдаления
       |    , Цены.PARENTEXT [Владелец $Справочник.Номенклатура]
       |    , $Цены.Валюта [Валюта $Справочник.Валюты]
       |    , $ПоследнееЗначение.Цены.Единица(Цены.ID, :ВыбДата) [Единица $Справочник.Единицы]
       |    , $Цены.Процент Процент
       |    , $Цены.ТипЦен [ТипЦен $Справочник.ТипыЦен]
       |    , $ПоследнееЗначение.Цены.Цена(Цены.ID, :ВыбДата) Цена
       |FROM $Справочник.Цены AS Цены With (NOLOCK)
       |WHERE (Цены.PARENTEXT = :Номенклатура)
       |    AND ($Цены.ТипЦен = :ТипЦен)

Как сделать вторую колонку со второй ценой?
4 toypaul
 
гуру
09.04.13
13:52
(3) select p,max(c1),max(c2) from c group by p
5 Lacoster
 
09.04.13
13:57
(4) "мах" тут зачем?  У меня есть цены оптовые, не оптовые. Мне не нужно "мах"
6 Ёпрст
 
09.04.13
13:57
|Select
|    Номенклатура.id [Номенклатура $Справочник.Номенклатура]
|   ,case when $Цены.ТипЦен =:ТипЦен1 then $ПоследнееЗначение.Цены.Цена(Цены.ID, :ВыбДата) end Цена1
|   ,case when $Цены.ТипЦен =:ТипЦен2 then $ПоследнееЗначение.Цены.Цена(Цены.ID, :ВыбДата) end Цена2
|   ,$ПоследнееЗначение.Цены.Единица(Цены.ID, :ВыбДата) [Единица $Справочник.Единицы]
|   ,$Цены.Валюта [Валюта $Справочник.Валюты]
|from $Справочник.Номенклатура Номенклатура (nolock)
|left join $Справочник.Цены Цены (nolock) on Цены.parentext = Номенклатура.id and $Цены.ТипЦен in (:ТипЦен1,:ТипЦен2)
7 Ёпрст
 
09.04.13
13:59
ну еще можно так дописать
|   ,case when $Цены.ТипЦен =:ТипЦен1 then $ПоследнееЗначение.Цены.Цена(Цены.ID, :ВыбДата) else 0 end Цена1
|   ,case when $Цены.ТипЦен =:ТипЦен2 then $ПоследнееЗначение.Цены.Цена(Цены.ID, :ВыбДата) else 0 end Цена2
8 toypaul
 
гуру
09.04.13
14:03
(5) направление задал, дальше своей головой.
9 Lacoster
 
10.04.13
07:43
Короче не получилось с CASE
Пришлось словчить и сделать вот так
       |SELECT Цены.ID [Ссылка $Справочник.Цены]
       |    , Цены.ISMARK ПометкаУдаления
       |    , Цены.PARENTEXT [Владелец $Справочник.Номенклатура]
       |    , $Цены.Валюта [Валюта $Справочник.Валюты]
       |    , $ПоследнееЗначение.Цены.Единица(Цены.ID, :ВыбДата) [Единица $Справочник.Единицы]
       |    , $Цены.Процент Процент
       |    , $Цены.ТипЦен [ТипЦен $Справочник.ТипыЦен]
       |    , $ПоследнееЗначение.Цены.Цена(Цены.ID, :ВыбДата) Цена
       |    , $ПоследнееЗначение.Цены.Цена(Цены2.ID, :ВыбДата) Цена2
       |FROM $Справочник.Цены AS Цены
       |    JOIN    $Справочник.Цены AS Цены2
       |ON Цены.PARENTEXT=Цены2.PARENTEXT
       |WHERE (Цены.PARENTEXT = :Номенклатура)
       |    AND ($Цены.ТипЦен = :ТипЦен)
       |    AND ($Цены2.ТипЦен = :ТипЦен2)
       |";
10 cw014
 
10.04.13
07:46
then $ПоследнееЗначение.Цены.Цена(Цены.ID, :ВыбДата~~) and Цена1

Что такое "and Цена1"???
11 Lacoster
 
10.04.13
11:50
(10) and это завершение CASE. Цена1 это название колонки.
Можно было написать так and as Цена1
12 Ёпрст
 
10.04.13
13:35
(9) а чего не получилось то ?
А (6)+(7) не работает у тебя ?
13 Ёпрст
 
10.04.13
13:36
(10) там end надо писать, ошибка в синтаксисе
14 Lacoster
 
10.04.13
14:17
(13) Я всё сделал. Но твоё решение не работало
15 Ёпрст
 
10.04.13
14:20
(14)Ошибку писал, или что ?
16 Lacoster
 
10.04.13
14:22
Была таблица вот такого плана
Номенклатура/цена1/цена2
Шина/213/0
шина/123/0
масло/0/1231
Короче если 0 в цене1,тогда в цене2 будет нормально, и наоборот.
Ошибки не было.
17 Ёпрст
 
10.04.13
15:29
(16) и ? а у тебя точно есть для для одной номенклатуры цены с твоими типами цен ?
18 pvase
 
10.04.13
15:37
Можно через CASE или UNION ALL сделать минуя джойны.
19 Ёпрст
 
10.04.13
15:39
Ну ясно, тебе свернуть надо без учета Типа цен что ли ?
20 pvase
 
10.04.13
15:42
SELECT Цены.ID [Ссылка $Справочник.Цены]
   , Цены.ISMARK ПометкаУдаления
   , Цены.PARENTEXT [Владелец $Справочник.Номенклатура]
   , $Цены.Валюта [Валюта $Справочник.Валюты]
   , $ПоследнееЗначение.Цены.Единица(Цены.ID, :ВыбДата) [Единица $Справочник.Единицы]
   , $Цены.Процент Процент
   , $Цены.ТипЦен [ТипЦен $Справочник.ТипыЦен]
   , CASE WHEN $Цены.ТипЦен = :ТипЦен THEN $ПоследнееЗначение.Цены.Цена(Цены.ID, :ВыбДата) ELSE NULL END AS Цена
   , CASE WHEN $Цены.ТипЦен = :ТипЦен2 THEN $ПоследнееЗначение.Цены.Цена(Цены.ID, :ВыбДата) ELSE NULL END AS Цена2
FROM $Справочник.Цены AS Цены
WHERE (Цены.PARENTEXT = :Номенклатура)
21 pvase
 
10.04.13
16:12
Чтобы получить список всей номенклатуры из условия:

SELECT Цены.ID [Ссылка $Справочник.Цены]
   , Цены.ISMARK ПометкаУдаления
   , Номенклатура.ID [Владелец $Справочник.Номенклатура]
   , $Цены.Валюта [Валюта $Справочник.Валюты]
   , $ПоследнееЗначение.Цены.Единица(Цены.ID, :ВыбДата) [Единица $Справочник.Единицы]
   , $Цены.Процент Процент
   , $Цены.ТипЦен [ТипЦен $Справочник.ТипыЦен]
   , CASE WHEN $Цены.ТипЦен = :ТипЦен THEN $ПоследнееЗначение.Цены.Цена(Цены.ID, :ВыбДата) ELSE NULL END AS Цена
   , CASE WHEN $Цены.ТипЦен = :ТипЦен2 THEN $ПоследнееЗначение.Цены.Цена(Цены.ID, :ВыбДата) ELSE NULL END AS Цена2
FROM
   $Справочник.Номенклатура AS Номенклатура
   LEFT OUTER JOIN $Справочник.Цены AS Цены ON (Цены.PARENTEXT = Номенклатура.ID)
WHERE (Номенклатура.ID = :Номенклатура)
22 toypaul
 
гуру
10.04.13
19:47
(16) еще в (4) был дан ответ как сделать правильно
Программист всегда исправляет последнюю ошибку.