Имя: Пароль:
1C
1C 7.7
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...
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.