SELECT Подзапрос.ПодзапросНоменклатура [ПодзапросНоменклатура $Справочник.Номенклатура], Подзапрос.ПодзапросСклад [ПодзапросСклад $Справочник.Склады], SUM( CASE WHEN Подзапрос.ПодзапросПериод = $НачалоПериода.День(:ДатаКонца~) THEN CASE WHEN Подзапрос.КоличествоКонечныйОстаток > 0 THEN CASE WHEN Подзапрос. ПодзапросКоличествоКонечныйОстаток <= 0 THEN DATEDIFF(day, Подзапрос.ОстаткиТМЦОстаткиОбороты1Период, Подзапрос.ПодзапросПериод) ELSE DATEDIFF(day, Подзапрос.ОстаткиТМЦОстаткиОбороты1Период, :ДатаКонца~) + 1 END ELSE CASE WHEN Подзапрос.ПодзапросКоличествоКонечныйОстаток > 0 THEN DATEDIFF(day, Подзапрос.ПодзапросПериод, :ДатаКонца~) + 1 ELSE 0 END END ELSE CASE WHEN Подзапрос.КоличествоКонечныйОстаток > 0 THEN DATEDIFF(day, Подзапрос.ОстаткиТМЦОстаткиОбороты1Период, Подзапрос.ПодзапросПериод) ELSE 0 END END ) as КоличествоДнейВПродаже FROM ( SELECT Запрос2Уровня.ПодзапросНоменклатура ПодзапросНоменклатура , Запрос2Уровня.ПодзапросСклад ПодзапросСклад , Запрос2Уровня.ПодзапросКоличествоКонечныйОстаток , Запрос2Уровня.ПодзапросПериод , Запрос2Уровня.ОстаткиТМЦОстаткиОбороты1Период , Запрос2Уровня.КоличествоКонечныйОстаток FROM ( SELECT Запрос1Уровня.Номенклатура ПодзапросНоменклатура , Запрос1Уровня.Склад ПодзапросСклад , Запрос1Уровня.КоличествоКонечныйОстаток ПодзапросКоличествоКонечныйОстаток , Запрос1Уровня.Период ПодзапросПериод , Запрос1Уровня.ОстаткиТМЦОстаткиОбороты1Период , ОстаткиТМЦОстаткиОбороты.КоличествоКонечныйОстаток FROM $РегистрОстаткиОбороты.ОстаткиТМЦ(:ДатаНачала,:ДатаКонца~,День,,,,(Номенклатура, Склад),) AS ОстаткиТМЦОстаткиОбороты INNER JOIN ( SELECT ОстаткиТМЦОстаткиОбороты.Номенклатура , ОстаткиТМЦОстаткиОбороты.Склад , ОстаткиТМЦОстаткиОбороты.КоличествоКонечныйОстаток , ОстаткиТМЦОстаткиОбороты.Период , MAX(ОстаткиТМЦОстаткиОбороты1.Период) ОстаткиТМЦОстаткиОбороты1Период FROM $РегистрОстаткиОбороты.ОстаткиТМЦ(:ДатаНачала,:ДатаКонца~,День,,,,(Номенклатура, Склад),) AS ОстаткиТМЦОстаткиОбороты LEFT JOIN $РегистрОстаткиОбороты.ОстаткиТМЦ(:ДатаНачала,:ДатаКонца~,День,,,,(Номенклатура, Склад),) AS ОстаткиТМЦОстаткиОбороты1 ON ОстаткиТМЦОстаткиОбороты.Номенклатура = ОстаткиТМЦОстаткиОбороты1.Номенклатура AND ОстаткиТМЦОстаткиОбороты.Склад = ОстаткиТМЦОстаткиОбороты1.Склад AND ОстаткиТМЦОстаткиОбороты.Период > ОстаткиТМЦОстаткиОбороты1.Период GROUP BY ОстаткиТМЦОстаткиОбороты.Номенклатура , ОстаткиТМЦОстаткиОбороты.Склад , ОстаткиТМЦОстаткиОбороты.КоличествоКонечныйОстаток , ОстаткиТМЦОстаткиОбороты.Период ) AS Запрос1Уровня ON ОстаткиТМЦОстаткиОбороты.Номенклатура = Запрос1Уровня.Номенклатура AND ОстаткиТМЦОстаткиОбороты.Склад = Запрос1Уровня.Склад AND ОстаткиТМЦОстаткиОбороты.Период = Запрос1Уровня.ОстаткиТМЦОстаткиОбороты1Период ) AS Запрос2Уровня ) AS Подзапрос GROUP BY Подзапрос.ПодзапросНоменклатура , Подзапрос.ПодзапросСклад ORDER BY Подзапрос.ПодзапросНоменклатура , Подзапрос.ПодзапросСклад
Прямой запрос к SQL-базе: количество дней наличия товара на складе за период
27.10.07
tormozit в своей статье http://infostart.ru/articles/228/ приводил пример для "восьмерки", идея мне понравилась, поэтому решил из-за производственной необходимости переписать на прямой запрос к SQL-базе 7.7...
Чуть позже, если получится, перепишу для dbf-базы.
Чуть позже, если получится, перепишу для dbf-базы.