в общем в статье о прямых запросах я этот момент для ДБФ переписал привожу кусок статьи с корректировкой для СКЛ
Сначала сделаем простой запрос с группировкой день |SELECT | Рег.Товар as [Товар $Справочник.Номенклатура], | Рег.Период Период, | SUM(Рег.Количество) as Количество |FROM | (SELECT | $Р.Номенклатура as Товар, | $Р.Количество as Количество, | CAST(LEFT(jr.date_time_iddoc,8) as datetime) AS Период | FROM $Регистр.ОстаткиТоваров as Р | INNER JOIN | 1sjourn jr ON (Р.iddoc = jr.iddoc) | And (jr.date BETWEEN :НачДата~~ AND :КонДата~~) | WHERE | AND ($ФлагРегистра. ОстаткиТоваров = 1) | ) as Рег |GROUP BY | Рег.Товар, | Рег.Период
Теперь сделаем запрос с группировкой неделя. |SELECT | Рег.Товар as [Товар $Справочник.Номенклатура], | Рег.Период Период, | SUM(Рег.Количество) as Количество |FROM | (SELECT | Рег.Товар, | CASE WHEN Рег.Период - datepart(dw,Рег.Период)<:НачДата~~ THEN | :НачДата~~ | ELSE | Рег.Период - datepart(dw,Рег.Период) | END AS Период | FROM | (SELECT | $Р.Номенклатура as Товар, | $Р.Количество as Количество, | CAST(LEFT(jr.date_time_iddoc,8) as datetime) AS Период | FROM $Регистр.ОстаткиТоваров as Р | INNER JOIN | 1sjourn jr ON (Р.iddoc = jr.iddoc) | And (jr.date BETWEEN :НачДата~~ AND :КонДата~~) | WHERE | AND ($ФлагРегистра. ОстаткиТоваров = 1) | ) as Рег | ) as Рег |GROUP BY | Рег.Товар, | Рег.Период
Теперь посмотрим на запрос с группировкой Месяц |SELECT | Рег.Товар as [Товар $Справочник.Номенклатура], | Рег.Период Период, | SUM(Рег.Количество) as Количество |FROM | (SELECT | Рег.Товар, | CASE WHEN Рег.Период < :НачДата~~ THEN | НачДата~~ | ELSE | Рег.Период | END AS Период | FROM | (SELECT | $Р.Номенклатура as Товар, | $Р.Количество as Количество, | CAST(LEFT(jr.date_time_iddoc,4)+RIGHT(LEFT(jr.date_time_iddoc,6),2)+'01' as datetime) AS Период | FROM $Регистр.ОстаткиТоваров as Р | INNER JOIN | 1sjourn jr ON (Р.iddoc = jr.iddoc) | And (jr.date BETWEEN :НачДата~~ AND :КонДата~~) | WHERE | AND ($ФлагРегистра. ОстаткиТоваров = 1) | ) as Рег | ) as Рег |GROUP BY | Рег.Товар, | Рег.Период
группировка Квартал. |SELECT | Рег.Товар as [Товар $Справочник.Номенклатура], | Рег.Период Период, | SUM(Рег.Количество) as Количество |FROM | (SELECT | Рег.Товар, | CASE WHEN Рег.Период < :НачДата~~ THEN | НачДата~~ | ELSE | Рег.Период | END AS Период | FROM | (SELECT | $Р.Номенклатура as Товар, | $Р.Количество as Количество, | CAST(LEFT(jr.date_time_iddoc,4)+ | CASE WHEN RIGHT(LEFT(jr.date_time_iddoc,6),2)<'4' THEN '01' | ELSE | CASE WHEN RIGHT(LEFT(jr.date_time_iddoc,6),2)<'7' THEN '04' | ELSE | CASE WHEN RIGHT(LEFT(jr.date_time_iddoc,6),2)<'10' THEN '07' | ELSE '10' | END | END | END+'01' as datetime) AS Период | FROM $Регистр.ОстаткиТоваров as Р | INNER JOIN | 1sjourn jr ON (Р.iddoc = jr.iddoc) | And (jr.date BETWEEN :НачДата~~ AND :КонДата~~) | WHERE | AND ($ФлагРегистра. ОстаткиТоваров = 1) | ) as Рег | ) as Рег |GROUP BY | Рег.Товар, | Рег.Период
группировка - Год |SELECT | Рег.Товар as [Товар $Справочник.Номенклатура], | Рег.Период Период, | SUM(Рег.Количество) as Количество |FROM | (SELECT | Рег.Товар, | CASE WHEN Рег.Период < :НачДата~~ THEN | НачДата~~ | ELSE | Рег.Период | END AS Период | FROM | (SELECT | $Р.Номенклатура as Товар, | $Р.Количество as Количество, | CAST(LEFT(jr.date_time_iddoc,4)+'0101' as datetime) AS Период | FROM $Регистр.ОстаткиТоваров as Р | INNER JOIN | 1sjourn jr ON (Р.iddoc = jr.iddoc) | And (jr.date BETWEEN :НачДата~~ AND :КонДата~~) | WHERE | AND ($ФлагРегистра. ОстаткиТоваров = 1) | ) as Рег | ) as Рег |GROUP BY | Рег.Товар, | Рег.Период
В итоге у меня получился универсальный код, работающий как на СКЛ так и на ДБФ платформах.
|