Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Нарастающий итог (число прочтений - 2945 )
DrunkProgrammer
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 128
Зарегистрирован: 28. Декабря 2007
Нарастающий итог
05. Марта 2009 :: 12:28
Печать  
Доброе время суток!
Вообще вопрос не столько по 1с++, сколько по SQL.
В общем есть у меня данные по дисконтым картам и суммам, поступившим на эти карты в разрезе дат.
Например, на карту "А001" 01 числа поступило 600 руб, 02 числа - 800, 03 числа - 300.
Нужно получить выборку в которой данные будут представлены в следующем виде:
А001 | 01/01/09 | 600
А001 | 02/01/09 | 1400
А001 | 03/01/09 | 1700

Т.е. нужны данные по нарастающей.

Пытался решить вопрос используя вложенный запрос, но получилась фигня.
Запрос мой выглядит примерно так:
Код
Выбрать все
SELECT
  Журнал.Date as ДатаДок,
  спрКарты.ID as [ИсточникСкидки $Справочник.Карточки],
  SUM($ЗакрТаб.Количество) as Количество,
  SUM(ВложенныйЗапрос.количество) as Количество1

FROM
   1SJOURN as Журнал
   LEFT JOIN $ДокументСтроки.ЗакрытиеСменыРеализация as ЗакрТаб ON ЗакрТаб.IDDoc = Журнал.IDDoc
   LEFT JOIN $Справочник.Карточки as спрКарты ON спрКарты.ID = TRIM(RIGHT($ЗакрТаб.ИсточникСкидки,17))
   LEFT JOIN (

SELECT
  Журнал.Date as ДатаДок,
  спрКарты.ID,
  SUM($ЗакрТаб.Количество) as Количество

FROM
   1SJOURN as Журнал
   LEFT JOIN $ДокументСтроки.ЗакрытиеСменыРеализация as ЗакрТаб ON ЗакрТаб.IDDoc = Журнал.IDDoc
   LEFT JOIN $Справочник.Карточки as спрКарты ON спрКарты.ID = TRIM(RIGHT($ЗакрТаб.ИсточникСкидки,17))
WHERE
   Журнал.Date BETWEEN :ДатаНачала~~ AND :ДатаКонца~~
   AND Журнал.IDDocDef = $ВидДокумента.ЗакрытиеСменыРеализация
   AND спрКарты.ID IS NOT NULL

GROUP BY
  Журнал.Date,
  спрКарты.ID
) as ВложенныйЗапрос ON ВложенныйЗапрос.ID = спрКарты.ID AND ВложенныйЗапрос.ДатаДок <= Журнал.Date

WHERE
   Журнал.Date BETWEEN :ДатаНачала~~ AND :ДатаКонца~~
   AND Журнал.IDDocDef = $ВидДокумента.ЗакрытиеСменыРеализация
   AND спрКарты.ID IS NOT NULL

GROUP BY
  Журнал.Date,
  спрКарты.ID 

  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Нарастающий итог
Ответ #1 - 05. Марта 2009 :: 12:47
Печать  
сначала про твой запрос (ИХМО)нужны не left join  а inner join
Тебе же не нужны документы без табличной части
аналогично и с карточками тебе же не нужны строки где нет карточек.
Далее код вообще не понятен
спрКарты.ID = TRIM(RIGHT($ЗакрТаб.ИсточникСкидки,17))

конкретно по нарастающим итогам смотри
http://www.1cpp.ru/forum/YaBB.pl?num=1185864029/5#5
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Нарастающий итог
Ответ #2 - 05. Марта 2009 :: 15:49
Печать  
Вот шматок из моего отчета по сборке и оплате заявок, итог считается в разрезе исполнителей и дней (можно убрать условие)

    ТекстЗапроса = "
     |select a.id
...
     |, sum(isnull(b.kolu, 0)) + max(a.kolu) itkolu
     |, cast(0.00 as numeric(10,2)) dopl into #tempsbs
     |from #tempsb a (nolock)
     |left outer join #tempsb b (nolock) on b.id < a.id and b.isp = a.isp and b.day = a.day
     |group by a.id,
...
     |";
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
DrunkProgrammer
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 128
Зарегистрирован: 28. Декабря 2007
Re: Нарастающий итог
Ответ #3 - 06. Марта 2009 :: 05:13
Печать  
Z1 писал(а) 05. Марта 2009 :: 12:47:
Далее код вообще не понятен

Да просто не разобрал ты мой код.

В общем правильный код такой:
Код
Выбрать все
SELECT
Main.ДатаДок,
Main.Карта as [Карта $Справочник.Карточки],
Main.ИсточникСкидкиРодитель,
Main.Кол,
SUM(Sec.Кол)

FROM


(SELECT
  Журнал.Date as ДатаДок,
  TRIM(RIGHT($ЗакрТаб.ИсточникСкидки,17)) as Карта,
  спрКарты.ParentID as ИсточникСкидкиРодитель,
  SUM($ЗакрТаб.Количество) as Кол
FROM
   1SJOURN as Журнал
   LEFT JOIN $ДокументСтроки.ЗакрытиеСменыРеализация as ЗакрТаб ON ЗакрТаб.IDDoc = Журнал.IDDoc
   LEFT JOIN $Справочник.Карточки as спрКарты ON спрКарты.ID = TRIM(RIGHT($ЗакрТаб.ИсточникСкидки,17))


 WHERE
   Журнал.Date BETWEEN :ДатаНачала~~ AND :ДатаКонца~~
   AND Журнал.IDDocDef = $ВидДокумента.ЗакрытиеСменыРеализация
   AND спрКарты.ID IS NOT NULL
GROUP BY
  Журнал.Date,
  $ЗакрТаб.ИсточникСкидки,
  спрКарты.ParentID) as Main

LEFT JOIN

(SELECT
  Журнал.Date as ДатаДок,
  TRIM(RIGHT($ЗакрТаб.ИсточникСкидки,17)) as Карта,
  спрКарты.ParentID as ИсточникСкидкиРодитель,
  SUM($ЗакрТаб.Количество) as Кол
FROM
   1SJOURN as Журнал
   LEFT JOIN $ДокументСтроки.ЗакрытиеСменыРеализация as ЗакрТаб ON ЗакрТаб.IDDoc = Журнал.IDDoc
   LEFT JOIN $Справочник.Карточки as спрКарты ON спрКарты.ID = TRIM(RIGHT($ЗакрТаб.ИсточникСкидки,17))


 WHERE
   Журнал.Date BETWEEN :ДатаНачала~~ AND :ДатаКонца~~
   AND Журнал.IDDocDef = $ВидДокумента.ЗакрытиеСменыРеализация
   AND спрКарты.ID IS NOT NULL
GROUP BY
  Журнал.Date,
  $ЗакрТаб.ИсточникСкидки,
  спрКарты.ParentID) as Sec ON Sec.Карта = Main.Карта AND Sec.ДатаДок <= Main.ДатаДок


GROUP BY
Main.ДатаДок,
Main.Карта,
Main.ИсточникСкидкиРодитель,
Main.Кол 

  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Нарастающий итог
Ответ #4 - 06. Марта 2009 :: 09:51
Печать  
Вот простой пример для 8 Улыбка
Цитата:
ВЫБРАТЬ
   ПериодыИзменения.Период КАК Время,
   СУММА(Регистр.СуммаОборот) КАК Сумма
ИЗ
   (ВЫБРАТЬ РАЗЛИЧНЫЕ
       ПродажиПоДисконтнымКартам.Период КАК Период
   ИЗ
       РегистрНакопления.ПродажиПоДисконтнымКартам КАК ПродажиПоДисконтнымКартам
   ГДЕ
       ПродажиПоДисконтнымКартам.ДисконтнаяКарта = &Ссылка) КАК ПериодыИзменения
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           ПродажиПоДисконтнымКартамОбороты.Период КАК Период,
           ПродажиПоДисконтнымКартамОбороты.СуммаОборот КАК СуммаОборот
       ИЗ
           РегистрНакопления.ПродажиПоДисконтнымКартам.Обороты(, , Регистратор, ДисконтнаяКарта = &Ссылка) КАК ПродажиПоДисконтнымКартамОбороты
       ГДЕ
           ПродажиПоДисконтнымКартамОбороты.ДисконтнаяКарта = &Ссылка) КАК Регистр
       ПО ПериодыИзменения.Период >= Регистр.Период

СГРУППИРОВАТЬ ПО
   ПериодыИзменения.Период


Видна суть схемы получения нарастающих итогов Улыбка
Если нужны доп.измерения, просто добавляем по ним группировку и в соединении указываем доп.равенство по ним.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Злой Бобр
Junior Member
**
Отсутствует



Сообщений: 56
Местоположение: Украина, Кривой Рог
Зарегистрирован: 07. Марта 2009
Пол: Мужской
Re: Нарастающий итог
Ответ #5 - 07. Марта 2009 :: 14:50
Печать  
Когда научишся внятно и понятно задавать вопросы, тогда и получишь правильный ответ.
Тихо (шепотом) - Индексированная таблица поможет ...
  

Если у вас есть деньги тогда мы идем к вам!!!
Наверх
ICQ  
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Нарастающий итог
Ответ #6 - 07. Марта 2009 :: 22:11
Печать  
offtopic
Цитата:
Чтобы правильно задать вопрос, нужно знать большую часть ответа.

Ask a foolish question. 
by Robert Sheckley
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать