|
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) был дан ответ как сделать правильно
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |