![]() |
![]() |
![]() |
|
v7: переделать запрос на прямой | ☑ | ||
---|---|---|---|---|
0
lamme
26.12.11
✎
05:45
|
Есть запрос. Помогите передалть на прямой запрос.
Запрос=СоздатьОбъект("Запрос"); ТекстЗапроса=" |ПЕРИОД С ДатаНачала По ДатаКонца; |Без итогов; |Агент = Регистр.Продажи.Клиент.Агент; |Товар = Регистр.Продажи.Товар; |Склад = Регистр.Продажи.Склад; |КоличествоПродаж = Регистр.Продажи.Количество; |Функция ПроданноСкл1 = Сумма(КоличествоПродаж) Когда (Склад = Скл1); |Функция ПроданноСкл2 = Сумма(КоличествоПродаж) Когда (Склад = Скл2); |Группировка Товар Упорядочить по Товар.Наименование без групп; |Группировка Месяц; |Условие (Склад в СписокСкладов); |Условие (Товар в СписокТоваров); |"; В итоге получается таблица Товар/ Месяц / ПроданоСкл1 / ПроданоСкл2 Пытаюсь передалть на прямой запрос - знаний не хватет |SELECT ПродажиОбороты.Товар [Товар $Справочник.Товары], ПродажиОбороты.КоличествоОборот , $ПродажиОбороты.Склад |FROM $РегистрОбороты.Продажи(:НачДата~, :КонДата~ ,,,(Склад = :выбСкл) AND (Товар IN (SELECT Val From #Группа)),Товар,Количество) AS ПродажиОбороты |GROUP BY ПродажиОбороты.Товар, ПродажиОбороты.КоличествоОборот"; Затруднения 1. как указать колонку период=месяц 2. как указать что продажи нужны по скл1 и скл2 |
|||
1
Aleksey
26.12.11
✎
05:47
|
Прямой какой? 1SQlite, 1С++, или как?
|
|||
2
lamme
26.12.11
✎
05:48
|
1С++
|
|||
3
lamme
26.12.11
✎
06:09
|
с выводом итогов по месяцам разобрался
|SELECT ПродажиОбороты.Товар [Товар $Справочник.Товары], ПродажиОбороты.КоличествоОборот, ПродажиОбороты.Период |FROM $РегистрОбороты.Продажи(:НачДата~, :КонДата~ ,Месяц,,(Склад = :выбСкл) AND (Товар IN (SELECT Val From #Группа)),Товар,Количество) AS ПродажиОбороты |GROUP BY ПродажиОбороты.Товар , ПродажиОбороты.Период,ПродажиОбороты.КоличествоОборот" ; Остался вопрос как указать - что нужны колво продано1 при условии что склад = выбСкл1 и продано2 при условии что склад = выбСкл2 и |
|||
4
lamme
26.12.11
✎
06:09
|
?
|
|||
5
lamme
26.12.11
✎
06:11
|
ну не делать же 2 запроса
потом в какой то ТЗ объединять их |
|||
6
Дядя Васька
26.12.11
✎
06:11
|
Так не?
|SELECT ПродажиОбороты.Товар [Товар $Справочник.Товары], ПродажиОбороты.КоличествоОборот, ПродажиОбороты.Период |FROM $РегистрОбороты.Продажи(:НачДата~, :КонДата~ ,Месяц,,(Склад = :выбСкл1 OR Склад = :выбСкл2) AND (Товар IN (SELECT Val From #Группа)),Товар,Количество) AS ПродажиОбороты |GROUP BY ПродажиОбороты.Товар , ПродажиОбороты.Период,ПродажиОбороты.КоличествоОборот" ; |
|||
7
Гефест
26.12.11
✎
06:12
|
(4) Кури конструкцию case-when-else
Но лучше группируй по складу |
|||
8
lamme
26.12.11
✎
06:14
|
(6)
тут вроде бы получиться что продажи смотрим или по выбСкл1 или по выбСкл2 проверю конечно .. но мучают сомнения |
|||
9
Дядя Васька
26.12.11
✎
06:15
|
(8) А, пардон... Ну тогда джойнить надо.
|
|||
10
lamme
26.12.11
✎
06:16
|
(6)
ну да .. в итоге получается таблица с колонками Товар, КолвоОборот, Месяц где в КолвоОборот - одновременно входят продажи по ВыбСкл1 и ВыбСкл2 а надо как то разделить эти 2 цифры по этим 2 складам |
|||
11
lamme
26.12.11
✎
06:17
|
(7), (9)
а ткните пример - как это сделать а |
|||
12
DCKiller
26.12.11
✎
06:18
|
CASE WHEN
ПродажиОбороты.Склад = :ВыбСклад1 THEN ПродажиОбороты.КоличествоПродажОборот ELSE 0 END |
|||
13
lamme
26.12.11
✎
06:18
|
(12)
ух ты .. прикольно .. а пардон - это в какую часть запросса вставлять |
|||
14
Дядя Васька
26.12.11
✎
06:19
|
|SELECT ПродажиОбороты.Товар [Товар $Справочник.Товары], ПродажиОбороты.КоличествоОборот, ПродажиОбороты2.КоличествоОборот, ПродажиОбороты.Период
|FROM $РегистрОбороты.Продажи(:НачДата~, :КонДата~ ,Месяц,,(Склад = :выбСкл1 OR Склад = :выбСкл2) AND (Товар IN (SELECT Val From #Группа)),Товар,Количество) AS ПродажиОбороты |INNER JOIN (SELECT ПродажиОбороты.Товар [Товар $Справочник.Товары], ПродажиОбороты.КоличествоОборот, ПродажиОбороты.Период |FROM $РегистрОбороты.Продажи(:НачДата~, :КонДата~ ,Месяц,,(Склад = :выбСкл1 OR Склад = :выбСкл2) AND (Товар IN (SELECT Val From #Группа)),Товар,Количество) AS ПродажиОбороты2 ON (ПродажиОбороты1.Период = ПродажиОбороты2. Период), (ПродажиОбороты1.Товар = ПродажиОбороты2. Товар)) |GROUP BY ПродажиОбороты.Товар , ПродажиОбороты.Период,ПродажиОбороты.КоличествоОборот, ПродажиОбороты.КоличествоОборот2" ; За синтаксис не ручаюсь, но смысл такой. |
|||
15
Дядя Васька
26.12.11
✎
06:20
|
Ну в смысле так конечно:
|SELECT ПродажиОбороты.Товар [Товар $Справочник.Товары], ПродажиОбороты.КоличествоОборот, ПродажиОбороты2.КоличествоОборот, ПродажиОбороты.Период |FROM $РегистрОбороты.Продажи(:НачДата~, :КонДата~ ,Месяц,,(Склад = :выбСкл1) AND (Товар IN (SELECT Val From #Группа)),Товар,Количество) AS ПродажиОбороты |INNER JOIN (SELECT ПродажиОбороты.Товар [Товар $Справочник.Товары], ПродажиОбороты.КоличествоОборот, ПродажиОбороты.Период |FROM $РегистрОбороты.Продажи(:НачДата~, :КонДата~ ,Месяц,,(Склад = :выбСкл2) AND (Товар IN (SELECT Val From #Группа)),Товар,Количество) AS ПродажиОбороты2 ON (ПродажиОбороты1.Период = ПродажиОбороты2. Период), (ПродажиОбороты1.Товар = ПродажиОбороты2. Товар)) |GROUP BY ПродажиОбороты.Товар , ПродажиОбороты.Период,ПродажиОбороты.КоличествоОборот, ПродажиОбороты.КоличествоОборот2" ; |
|||
16
lamme
26.12.11
✎
06:21
|
(12)
(14) а где вернее будет, или это все об одном и том же ? |
|||
17
Андрей_Андреич
naïve
26.12.11
✎
06:21
|
Я один такой тупой? - Зачем группировка по "ПродажиОбороты.КоличествоОборот"? - Это yадо через Sum()
|
|||
18
lamme
26.12.11
✎
06:21
|
(15)
щас попробую |
|||
19
lamme
26.12.11
✎
06:21
|
(17)
тыкаюсь - как могу. поэтому - пардон за возможные ляпы |
|||
20
Дядя Васька
26.12.11
✎
06:22
|
(13) В Select, но не взлетит, если по обоим сразу выбирать через или он же тебе по складам не разобьет что по обоим продавалось, итог по обоим вернет вроде как.
|
|||
21
Дядя Васька
26.12.11
✎
06:27
|
Через CASE как-то так может получиться:
|SELECT ПродажиОбороты.Товар [Товар $Справочник.Товары], |CASE WHEN |ПродажиОбороты.Склад = :ВыбСклад1 THEN |ПродажиОбороты.КоличествоОборот |ELSE 0 END Количество1, |CASE WHEN |ПродажиОбороты.Склад = :ВыбСклад2 THEN |ПродажиОбороты.КоличествоОборот |ELSE 0 END Количество2 |(SELECT ПродажиОбороты.Товар [Товар $Справочник.Товары], ПродажиОбороты.Склад [Товар $Справочник.Склады], ПродажиОбороты.КоличествоОборот, ПродажиОбороты.Период |FROM $РегистрОбороты.Продажи(:НачДата~, :КонДата~ ,Месяц,,(Склад = :выбСкл1 OR Склад = :выбСкл2) AND (Товар IN (SELECT Val From #Группа)),Товар,Количество) AS ПродажиОбороты |GROUP BY ПродажиОбороты.Товар , ПродажиОбороты.Период,ПродажиОбороты.КоличествоОборот) AS ПродажиПоСкладам" ; |
|||
22
Дядя Васька
26.12.11
✎
06:28
|
|SELECT ПродажиОбороты.Товар [Товар $Справочник.Товары],
|CASE WHEN |ПродажиОбороты.Склад = :ВыбСклад1 THEN |ПродажиОбороты.КоличествоОборот |ELSE 0 END Количество1, |CASE WHEN |ПродажиОбороты.Склад = :ВыбСклад2 THEN |ПродажиОбороты.КоличествоОборот |ELSE 0 END Количество2 |FROM |(SELECT ПродажиОбороты.Товар [Товар $Справочник.Товары], ПродажиОбороты.Склад [Товар $Справочник.Склады], ПродажиОбороты.КоличествоОборот, ПродажиОбороты.Период |FROM $РегистрОбороты.Продажи(:НачДата~, :КонДата~ ,Месяц,,(Склад = :выбСкл1 OR Склад = :выбСкл2) AND (Товар IN (SELECT Val From #Группа)),Товар,Количество) AS ПродажиОбороты |GROUP BY ПродажиОбороты.Товар , ПродажиОбороты.Период,ПродажиОбороты.КоличествоОборот) AS ПродажиПоСкладам" ; короче все равно вложенный |
|||
23
lamme
26.12.11
✎
06:29
|
(21)
че то у меня (15) не хотит :( грит - Incorrect syntax near the keyword 'ON'. |
|||
24
Дядя Васька
26.12.11
✎
06:29
|
ну и в группировку там склад еще...
|
|||
25
Дядя Васька
26.12.11
✎
06:30
|
(23) Я там со скобками намудрил походу. Тупо синтаксическая ошибка, года два на ++ не писал.
|
|||
26
lamme
26.12.11
✎
06:33
|
|SELECT ПродажиОбороты.Товар [Товар $Справочник.Товары], ПродажиОбороты.КоличествоОборот, ПродажиОбороты2.КоличествоОборот, ПродажиОбороты.Период
|FROM $РегистрОбороты.Продажи(:НачДата~, :КонДата~ ,Месяц,,(Склад = :выбСкл1) AND (Товар IN (SELECT Val From #Группа)),Товар,Количество) AS ПродажиОбороты1 |INNER JOIN (SELECT ПродажиОбороты.Товар [Товар $Справочник.Товары], ПродажиОбороты.КоличествоОборот, ПродажиОбороты.Период |FROM $РегистрОбороты.Продажи(:НачДата~, :КонДата~ ,Месяц,,(Склад = :выбСкл2) AND (Товар IN (SELECT Val From #Группа)),Товар,Количество) AS ПродажиОбороты2 ON ((ПродажиОбороты1.Период = ПродажиОбороты2. Период), (ПродажиОбороты1.Товар = ПродажиОбороты2. Товар)) |GROUP BY ПродажиОбороты.Товар , ПродажиОбороты.Склад , ПродажиОбороты.Период,ПродажиОбороты.КоличествоОборот, ПродажиОбороты.КоличествоОборот2" ; не хотит ругается на ON |
|||
27
Дядя Васька
26.12.11
✎
06:35
|
Запятая явно не в тему опять же. Что-то такое. Отлаживай. Нагугли синтаксис INNER JOIN
|SELECT ПродажиОбороты.Товар [Товар $Справочник.Товары], ПродажиОбороты.КоличествоОборот, ПродажиОбороты2.КоличествоОборот, ПродажиОбороты.Период |FROM $РегистрОбороты.Продажи(:НачДата~, :КонДата~ ,Месяц,,(Склад = :выбСкл1) AND (Товар IN (SELECT Val From #Группа)),Товар,Количество) AS ПродажиОбороты |INNER JOIN (SELECT ПродажиОбороты.Товар [Товар $Справочник.Товары], ПродажиОбороты.КоличествоОборот, ПродажиОбороты.Период |FROM $РегистрОбороты.Продажи(:НачДата~, :КонДата~ ,Месяц,,(Склад = :выбСкл2) AND (Товар IN (SELECT Val From #Группа)),Товар,Количество) AS ПродажиОбороты2) ON ((ПродажиОбороты1.Период = ПродажиОбороты2. Период) AND (ПродажиОбороты1.Товар = ПродажиОбороты2. Товар)) |GROUP BY ПродажиОбороты.Товар , ПродажиОбороты.Период,ПродажиОбороты.КоличествоОборот, ПродажиОбороты.КоличествоОборот2" ; |
|||
28
ParaWiz
26.12.11
✎
06:37
|
и кстати замени :КонДата~ на :КонДата~~ ... если нужны результаты включая весь день КонДата
// не уверен на 100% конечно но вроде так было |
|||
29
Попытка1С
26.12.11
✎
06:53
|
(28) На самом деле надо так (:НачДата, :КонДата~,...)
(0) Группировки: Товар, Период, Склад. Продажи в sum() Нужные склады укладываешь в список, Условие Склад in (Select val from #СпСклады) Все это хозяйство выгружаешь в индексированную таблицу, создаешь индексы по обходу и вперед. |
|||
30
Дядя Васька
26.12.11
✎
07:02
|
(29) Зачем обходить, когда можно сделать прямо в запросе?
|
|||
31
Попытка1С
26.12.11
✎
07:10
|
(30) Можно сделать а можно и не делать это кому как.
|
|||
32
Андрей_Андреич
naïve
26.12.11
✎
07:16
|
|DECLARE @НулевоеКоличество Numeric(19,4)
|Set @НулевоеКоличество =0 |Select Товар [Товар $Справочник.Товары] |, Период |, Sum(Количество1) Количество1 |, Sum(Количество2) Количество2 |From |( |Select Товар, ПродажиОбороты.КоличествоОборот Количество1, @НулевоеКоличество Количество2 |FROM $РегистрОбороты.Продажи(:НачДата, :КонДата~ ,Месяц,, |(Склад = :выбСкл1) AND (Товар IN (SELECT Val From #Группа)),Товар,Количество) AS ПродажиОбороты1 |Union All |Select Товар, @НулевоеКоличество Количество1, ПродажиОбороты.КоличествоОборот Количество2 |FROM $РегистрОбороты.Продажи(:НачДата, :КонДата~ ,Месяц,, |(Склад = :выбСкл2) AND (Товар IN (SELECT Val From #Группа)),Товар,Количество) AS ПродажиОбороты2 |) Выборка |Group By Товар, Период |
|||
33
Андрей_Андреич
naïve
26.12.11
✎
07:17
|
(32) Это вместо Case. Корявенько, конечно.
|
|||
34
Попытка1С
26.12.11
✎
07:19
|
(32) Ну тогда уж Выборка.Товар
|
|||
35
Андрей_Андреич
naïve
26.12.11
✎
07:26
|
(34) Согласен - на коленке за секунду сляпано - косяки запросто
|
|||
36
DCKiller
26.12.11
✎
07:31
|
Да уж, ну вы все и писаки :) Мне это сразу напомнило древний баян про какой-то советсткий НИИ, в котором пытались математическими методами определить, сколько х..ев поместится в ведро. Раздуть из мухи такого слона - это только на мисте могут. Запрос простейший, а намудрили столько, что автор, по ходу, уже в ужасе рвет волосы у себя на попе, читая все это и повторяет про себя "Лучше бы я не спрашивал!.." :)
|
|||
37
Андрей_Андреич
naïve
26.12.11
✎
07:34
|
(36) Понятно, что вариантов написания может быть много.
А ТС лучше на тематический форум 1cpp вопросы задавать - здесь все 7.7 уже забыли и какашками кидаются |
|||
38
lamme
26.12.11
✎
08:07
|
(36)
не - спросить то можно было а вот ответы .. пока понятно мало что - поэтому и не понятно |
|||
39
DCKiller
26.12.11
✎
08:23
|
(38) Может, сделаем уже вот хотя бы как-то вот так, а?
"SELECT $СпрКлиенты.ID As Агент, РегПродажи.Товар, РегПродажи.Период, РегПродажи.Склад, SUM(CASE WHEN РегПродажи.Склад = :ВыбСклад1 THEN РегПродажи.КоличествоОборот ELSE 0 END) As ПроданоСкл1, SUM(CASE WHEN РегПродажи.Склад = :ВыбСклад2 THEN РегПродажи.КоличествоОборот ELSE 0 END) As ПроданоСкл2 FROM $РегистрОбороты.Продажи(:Нач~, :Кон~, Месяц, , Склад IN (SELECT val FROM #ВТСклады) AND Товар IN (SELECT val FROM #ВТТовары), (Товар, Склад), (Количество)) As РегПродажи INNER JOIN $Справочник.Контрагенты As СпрКлиенты ON СпрКлиенты.ID = РегПродажи.Клиент GROUP BY РегПродажи.Товар, РегПродажи.Склад, РегПродажи.Период, $СпрКлиенты.Агент" Запрос.УложитьСписокОбъектов(СписокСкладов, "#ВТСклады", "Склады"); // ********************* По крайней мере, хотя бы посмотришь, что получится... |
|||
40
lamme
26.12.11
✎
08:46
|
(39)
спасибо получилось примерно вот так |SELECT |ПродажиОбороты.Товар [Товар $Справочник.Товары], ПродажиОбороты.Период,ПродажиОбороты.Склад [Товар $Справочник.Склады], |SUM(CASE WHEN ПродажиОбороты.Склад = :выбСкл1 THEN ПродажиОбороты.КоличествоОборот ELSE 0 END) As ПроданоСкл1, |SUM(CASE WHEN ПродажиОбороты.Склад = :выбСкл2 THEN ПродажиОбороты.КоличествоОборот ELSE 0 END) As ПроданоСкл2 | |FROM $РегистрОбороты.Продажи(:НачДата~, :КонДата~ ,Месяц,,(Склад IN (SELECT val FROM #ВТСклады) ) AND (Товар IN (SELECT Val From #Группа)),(Склад,Товар),Количество) AS ПродажиОбороты |GROUP BY ПродажиОбороты.Товар , ПродажиОбороты.Период, ПродажиОбороты.КоличествоОборот, ПродажиОбороты.Склад" ; Надо еще проверить достоверность полученных цифр |
|||
41
Андрей_Андреич
naïve
26.12.11
✎
08:49
|
(40) Группировать надо только по товару и периоду
|
|||
42
lamme
26.12.11
✎
08:52
|
если убираю группировку по складу - начинает ругаться на Склады
Column 'ПродажиОбороты.Склад' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. |
|||
43
ЧеловекДуши
26.12.11
✎
09:02
|
(40)Зачем так уродовать суммы :)
Берд... |
|||
44
ЧеловекДуши
26.12.11
✎
09:03
|
+ я насчет складов 1 - 2
|
|||
45
ЧеловекДуши
26.12.11
✎
09:04
|
+ Добавь группировку "Склад" и у тебя будет сумма по каждому складу.
|
|||
46
Ёпрст
гуру
26.12.11
✎
09:04
|
(42)все правильно, склад есть в селект листе
|
|||
47
ЧеловекДуши
26.12.11
✎
09:04
|
+ в итоговую таблицу
|
|||
48
lamme
26.12.11
✎
09:05
|
(47)
в готовый запрос сможешь написать пока у меня работает корректно. понять не могу - что не верно |
|||
49
Ёпрст
гуру
26.12.11
✎
09:06
|
(48) см. (46)
|
|||
50
ЧеловекДуши
26.12.11
✎
09:07
|
(0) Сделай так
|SELECT |ПродажиОбороты.Товар [Товар $Справочник.Товары] , ПродажиОбороты.Период,ПродажиОбороты.Склад [Товар Справочник.Склады] , SUM(ПродажиОбороты.КоличествоОборот) As ПроданоСкл | |FROM $РегистрОбороты.Продажи(:НачДата~, :КонДата~ ,Месяц,,(Склад IN (SELECT val FROM #ВТСклады) ) AND (Товар IN (SELECT Val From #Группа)),(Склад,Товар),Количество) AS ПродажиОбороты |GROUP BY ПродажиОбороты.Товар , ПродажиОбороты.Период , ПродажиОбороты.КоличествоОборот , ПродажиОбороты.Склад" ; Все ровно у тебя уже есть группировка по складам. А уже в отчете ты будешь раскидывать склады так, как тебе надо. |
|||
51
ЧеловекДуши
26.12.11
✎
09:08
|
+(50) Строку " , ПродажиОбороты.КоличествоОборот" из группировки убери!
|
|||
52
ЧеловекДуши
26.12.11
✎
09:09
|
(48)У тебя плохое представление того, а что же ты хочешь получить и для чего это было сделано в старом отчете :)
|
|||
53
Ёпрст
гуру
26.12.11
✎
09:10
|
в запросе (40) выкини из селекта Склад и из гроупбай тоже - получишь сабж.
|
|||
54
lamme
26.12.11
✎
09:11
|
(50)
неа. я так уже пробовал. так получаться 4 колонки Товар*Период*Склад*КолвоПродано а надо чтобы КолвоПродано в одном запрсое считало по разным складам. т.е. (40) - дает данные Товар*Период*Склад(по идее не нужная колонка)*ПроданоСклад1*ПроданоСклад2 |
|||
55
ЧеловекДуши
26.12.11
✎
09:13
|
Если слушать (53) то делай так
|SELECT | ПродажиОбороты.Товар [Товар $Справочник.Товары] , ПродажиОбороты.Период ,ПродажиОбороты.Склад [Товар $Справочник.Склады] ,SUM(CASE WHEN ПродажиОбороты.Склад = :выбСкл1 THEN ПродажиОбороты.КоличествоОборот ELSE 0 END) As ПроданоСкл1 ,SUM(CASE WHEN ПродажиОбороты.Склад = :выбСкл2 THEN ПродажиОбороты.КоличествоОборот ELSE 0 END) As ПроданоСкл2 ... // ...х... - это номер склада по списку... ,SUM(CASE WHEN ПродажиОбороты.Склад = :выбСкл(...х...) THEN ПродажиОбороты.КоличествоОборот ELSE 0 END) As ПроданоСкл(...х...) ... | |FROM $РегистрОбороты.Продажи(:НачДата~, :КонДата~ ,Месяц,,(Склад IN (SELECT val FROM #ВТСклады) ) AND (Товар IN (SELECT Val From #Группа)),(Склад,Товар),Количество) AS ПродажиОбороты |GROUP BY ПродажиОбороты.Товар , ПродажиОбороты.Период , ПродажиОбороты.Склад |
|||
56
Дядя Васька
26.12.11
✎
09:13
|
(48) Не совсем корректно, у тебя в каждой строке только один склад. По условиям задачи вроде как если товар присутствует на обоих складах, то это надо в одной строке вывести. Подобный вариант еще в (21) предложил, Select From Select нужен.
|
|||
57
lamme
26.12.11
✎
09:14
|
(55)
ну я так и сделал в (40) |
|||
58
Ёпрст
гуру
26.12.11
✎
09:14
|
(55) че курим то ?
|
|||
59
lamme
26.12.11
✎
09:16
|
(56)
эт верно ... :( |
|||
60
Ёпрст
гуру
26.12.11
✎
09:16
|
|SELECT
|ПродажиОбороты.Товар [Товар $Справочник.Товары], ПродажиОбороты.Период |SUM(CASE WHEN ПродажиОбороты.Склад = :выбСкл1 THEN ПродажиОбороты.КоличествоОборот ELSE 0 END) As ПроданоСкл1, |SUM(CASE WHEN ПродажиОбороты.Склад = :выбСкл2 THEN ПродажиОбороты.КоличествоОборот ELSE 0 END) As ПроданоСкл2 | |FROM $РегистрОбороты.Продажи(:НачДата~, :КонДата~ ,Месяц,,(Склад IN (SELECT val FROM #ВТСклады) ) AND (Товар IN (SELECT Val From #Группа)),(Склад,Товар),Количество) AS ПродажиОбороты |GROUP BY ПродажиОбороты.Товар , ПродажиОбороты.Период |
|||
61
Дядя Васька
26.12.11
✎
09:17
|
так как-то будет:
|SELECT |SUM(CASE WHEN ПоСкладам.Склад = :выбСкл1 THEN ПоСкладам.КоличествоОборот ELSE 0 END) As ПроданоСкл1, |SUM(CASE WHEN ПоСкладам.Склад = :выбСкл2 THEN ПоСкладам.КоличествоОборот ELSE 0 END) As ПроданоСкл2, |ПоСкладам.Товар [Товар $Справочник.Товары] |FROM | |(SELECT |ПродажиОбороты.Товар [Товар $Справочник.Товары], ПродажиОбороты.Период,ПродажиОбороты.Склад [Товар $Справочник.Склады] | |FROM $РегистрОбороты.Продажи(:НачДата~, :КонДата~ ,Месяц,,(Склад IN (SELECT val FROM #ВТСклады) ) AND (Товар IN (SELECT Val From #Группа)),(Склад,Товар),Количество) AS ПродажиОбороты |GROUP BY ПродажиОбороты.Товар , ПродажиОбороты.Период, ПродажиОбороты.КоличествоОборот, ПродажиОбороты.Склад) AS ПоСкладам" ; |
|||
62
ЧеловекДуши
26.12.11
✎
09:19
|
Рекомендую вместо периода воспользоваться этой функцией на SQL
ФункПР - Это имя твоей фугкции @len1 - Это строка даты, в виде ггггммдд, как по DATE_TIME_IDDOC @len2 - Это папраметр для получения периода 1 - день 2 - неделя 3 - квартал 4 - месяц 5 - год Обращение в запросе: dbo.Str_ToDay(ПН.День,1) На выходе этой функции ты получаешь тип дата //len1 - дата Строкой 8 симв (4 год + 2 мес + 2 день), len2 - параметр для результата ТекстЗапроса=" |if Object_ID('"+ФункПР+"') is null |Begin |Exec(' |create FUNCTION "+ФункПР+"( @len1 varchar(8), @len2 int) RETURNS datetime |AS |begin |declare @tval datetime; |declare @tval1 int; |declare @tval2 int; |set @tval = Cast(''17530101'' AS datetime); | |if (@len1 is null) or (LTrim(RTrim(@len1)) = '''') or (@tval >= Cast(@len1 AS datetime)) RETURN(@tval); | //1 - День |if @len2 = 1 set @tval = Cast(@len1 AS datetime); |Else |Begin // 2 - Неделя | if @len2 = 2 | Begin | set @tval = Cast(@len1 AS datetime); | set @tval1 = DatePart(w,@tval); | set @tval = DATEADD(d,1 - @tval1,@tval); | end | else | Begin // 3 - квартал | if @len2 = 3 | Begin | set @tval = Cast(@len1 AS datetime); | set @tval1 = DatePart(q,@tval); | set @tval2 = DatePart(yy,@tval); | if @tval1 = 1 set @tval = Cast( Str(@tval2,4,0)+''0101'' AS datetime) | else | if @tval1 = 2 set @tval = Cast( Str(@tval2,4,0)+''0401'' AS datetime) | else | if @tval1 = 3 set @tval = Cast( Str(@tval2,4,0)+''0701'' AS datetime) | else | if @tval1 = 4 set @tval = Cast( Str(@tval2,4,0)+''1001'' AS datetime); | End | else | Begin // 4 - месяц | if @len2 = 4 | Begin | set @tval = Cast(@len1 AS datetime); | set @tval1 = DatePart(d,@tval); | set @tval = DATEADD(d,1 - @tval1,@tval); | end | else | Begin // 5 - год | if @len2 = 5 | Begin | set @tval = Cast(@len1 AS datetime); | set @tval1 = DatePart(dy,@tval); | set @tval = DATEADD(d,1 - @tval1,@tval); | End | else | set @tval = Cast(@len1 AS datetime); | End; | end; | end; |end; | |RETURN(@tval); |end |') | |select 2 as Err |end else |select 1 as Err |"; |
|||
63
Дядя Васька
26.12.11
✎
09:19
|
+(61) Ну и период в первый select конечно
|
|||
64
ЧеловекДуши
26.12.11
✎
09:20
|
(57)Ты группировку посмотри, ты лишние сделал
|
|||
65
ЧеловекДуши
26.12.11
✎
09:22
|
+(62) В начале запроса поставь
set LANGUAGE russian А то дата будет неправильная :) |
|||
66
Дядя Васька
26.12.11
✎
09:23
|
(64) Да пофик, Продажи() с группировкой месяц все равно по одному количеству в месяц выдаст. По смыслу они там вообще не нужны никакие, результат уже сгруппирован, разве что синтаксис такой что требует. Но проверить не на чем.
|
|||
67
ЧеловекДуши
26.12.11
✎
09:24
|
(66)Ага... умник...
Отчет делается за год... |
|||
68
ЧеловекДуши
26.12.11
✎
09:24
|
Если ты недогнал.
|
|||
69
ЧеловекДуши
26.12.11
✎
09:25
|
+(66) Он там суммы группирует :)
|
|||
70
Дядя Васька
26.12.11
✎
09:31
|
(69) Да не, это ты не догнал. Я про суммы и говорю. Их по одной на месяц получается, в функции периодика задана. Складывать их не надо. Ему именно такой результат и нужен. С группировкой по сумме или без нее он будет одинаковый.
|
|||
71
Андрей_Андреич
naïve
26.12.11
✎
09:35
|
(70) Но методически неверно приучать писать таким образом. Человек же тебе верит...
|
|||
72
Mikeware
26.12.11
✎
09:37
|
Такое ощущение, что все "после корпоратива", с больной головой...
|
|||
73
Дядя Васька
26.12.11
✎
09:37
|
(71) Методически там вообще GROUP BY не нужен, о чем оговорился :) Правда есть вероятность что нужен синтаксически. А по смыслу в группировке по остальным полям толку столько же, сколько и по числовому в данном случае...
|
|||
74
Mikeware
26.12.11
✎
09:43
|
(73) Он там нужен и методически, и синтаксически. Только не по складам.
|
|||
75
Дядя Васька
26.12.11
✎
09:52
|
(74) В функции продаже в параметрах уже указан, период Месяц, группировка (Склад,Товар), условия по оным и что в разрезе их нужно взять количество. Дальнейшая группировка просто повторяет то что уже передали в параметрах. Никакой детализации по лишним измерениям она вернуть не должна. Так зачем повторяться? Ничего не меняет же в результатах.
|
|||
76
Ёпрст
гуру
26.12.11
✎
09:54
|
(75) укуренный ? Ты запрос в (0) хоть видел, какой нужен в итоге ?
:)) |
|||
77
Дядя Васька
26.12.11
✎
09:56
|
(76) Даже два варианта написал как это сделать :) В (61) Например. Там да, нужна, только в верхнем запросе, а не в том что с функцией.
|
|||
78
Андрей_Андреич
naïve
26.12.11
✎
09:58
|
(76) Пора лепить голосовалку - кто больше укуренный :)
Автора жалко - запросик-то и правда плевый. |
|||
79
Дядя Васька
26.12.11
✎
09:59
|
т.е. правильно как-то так. Там-то просто копипастил:
|SELECT |SUM(CASE WHEN ПоСкладам.Склад = :выбСкл1 THEN ПоСкладам.КоличествоОборот ELSE 0 END) As ПроданоСкл1, |SUM(CASE WHEN ПоСкладам.Склад = :выбСкл2 THEN ПоСкладам.КоличествоОборот ELSE 0 END) As ПроданоСкл2, |ПоСкладам.Товар [Товар $Справочник.Товары] |FROM | |(SELECT |ПродажиОбороты.Товар [Товар $Справочник.Товары], ПродажиОбороты.Период,ПродажиОбороты.Склад [Товар $Справочник.Склады] | |FROM $РегистрОбороты.Продажи(:НачДата~, :КонДата~ ,Месяц,,(Склад IN (SELECT val FROM #ВТСклады) ) AND (Товар IN (SELECT Val From #Группа)),(Склад,Товар),Количество) AS ПродажиОбороты) AS ПоСкладам |GROUP BY ПродажиОбороты.Товар , ПродажиОбороты.Период" ; |
|||
80
Андрей_Андреич
naïve
26.12.11
✎
10:01
|
(79) Наконец-то
|
|||
81
Андрей_Андреич
naïve
26.12.11
✎
10:01
|
(79) Период забыл?
|
|||
82
Дядя Васька
26.12.11
✎
10:03
|
(81) Забыл. В (63) оговаривался уже по этому поводу. Ну это мелочи, суммы верные и так.
|
|||
83
Дядя Васька
26.12.11
✎
10:06
|
(80) А наконец-то было в (14), тут уже вариант с извращениями ))
|
|||
84
trad
26.12.11
✎
10:15
|
(79) а на хуа подзапрос?
даже не учитывая этого и периода, еще есть как минимум одна грубейшая ошибка. |
|||
85
Андрей_Андреич
naïve
26.12.11
✎
10:20
|
(84) :НачДата~ хвостик неправильно загнут?
|
|||
86
trad
26.12.11
✎
10:22
|
ага
|
|||
87
trad
26.12.11
✎
10:24
|
и если с подзапросом, то этот запрос не рабочий по причине алиасов
|
|||
88
viktor_vv
26.12.11
✎
10:25
|
Ну и я встряну :). Это только мне кажется, что :НачДата~ надо заменить на :НачДата , а то за первый день периодв данные не попадут.
|
|||
89
lamme
27.12.11
✎
04:17
|
Кстати .. с утра фантазия .. почти эротического плана возникла ..
а есть какая ниб штуковина или механизм .. который брал бы запрос из (0) и легким движением правого пальца левой руки - превращался бы в прямой запрос , например как в (79) ? |
|||
90
Попытка1С
27.12.11
✎
05:01
|
(89) Вообще есть конструктор 1С++ если что. Он конечно из (0) ничего не сделает, но поможет для начала точно.
|
|||
91
lamme
27.12.11
✎
06:22
|
(90)
пользовался. видел. там надо самому делать запрос. я ж про другое ... есть обыкновенный запрос - оппа - готов прямой. |
|||
92
SnarkHunter
27.12.11
✎
06:43
|
А ключ от квартиры нужен?
От той, в которой деньги лежат? |
|||
93
lamme
27.12.11
✎
06:53
|
(92)
не ключ не .. квартира - да, можно. а ключ ... как том мало |
|||
94
Дядя Васька
27.12.11
✎
07:31
|
(84) А как без подзапроса чтобы не джойнить? Не сгруппируешь как надо.
|
|||
95
Андрей_Андреич
naïve
27.12.11
✎
07:40
|
|SELECT
|SUM(CASE WHEN ПоСкладам.Склад = :выбСкл1 THEN ПоСкладам.КоличествоОборот ELSE 0 END) As ПроданоСкл1, |SUM(CASE WHEN ПоСкладам.Склад = :выбСкл2 THEN ПоСкладам.КоличествоОборот ELSE 0 END) As ПроданоСкл2, |ПоСкладам.Товар [Товар $Справочник.Товары] |, ПоСкладм.Период |FROM $РегистрОбороты.Продажи(:НачДата, :КонДата~ ,Месяц,,(Склад IN (SELECT val FROM #ВТСклады) ) AND (Товар IN (SELECT Val From #Группа)),(Склад,Товар),Количество) AS ПоСкладам |GROUP BY ПоСкладам.Товар , ПоСкладам.Период |
|||
96
Андрей_Андреич
naïve
27.12.11
✎
07:41
|
|, ПоСкладм.Период
- ошибка надо ПоСкладАм |
|||
97
VladZ
27.12.11
✎
08:06
|
(3) А если у тебя со временем появится третий склад - будешь запрос переписывать?
|
|||
98
Mikeware
27.12.11
✎
08:09
|
(97) Да его и динамически сформировать - не проблема...
|
|||
99
Андрей_Андреич
naïve
27.12.11
✎
08:10
|
(99) +1
|
|||
100
Mikeware
27.12.11
✎
08:11
|
(99) сотню вычисляешь?
|
|||
101
Андрей_Андреич
naïve
27.12.11
✎
08:30
|
(100) В мыслях не было - на работе на части рвут. Хорошо пока мозг, а не анус.
|
|||
102
Salimbek
27.12.11
✎
08:53
|
(0) Я в такой ситуации не парюсь - вытаскиваю данные в виде /Товар/Склад/Циферка в ИТЗ, потом из нее спокойно получаю нужные цифры.
|
|||
103
Mikeware
27.12.11
✎
11:07
|
(102) Бывает нужно - для "кубиков" всяких
|
|||
104
Salimbek
27.12.11
✎
11:21
|
(103) Бывает, просто изредка замечаю, прямо таки, маниакальную потребность в получении 100%-готовой выборки прямо из скуля. При этом запросы становятся слишком громоздкими и нечитаемыми.
|
|||
105
Дядя Васька
28.12.11
✎
09:22
|
(95) Вроде бы так на ПоСкладам.Склад в списке SELECT ругнется, мол отсутствует в GROUP BY...
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |