Имя: Пароль:
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
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...
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.