Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Как бы сгруппировать таблицу по хитрому (число прочтений - 2191 )
kalleka
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 10
Зарегистрирован: 02. Марта 2009
Как бы сгруппировать таблицу по хитрому
27. Октября 2010 :: 19:34
Печать  
есть таблица
номер пер  сумма1 сумма2

1  1       25   35
2  1       10   15
3  2       12   20

нужно так свернуть таблицу, чтобы остались только строки с пер = 1, а сумма1 не вошедших срок, вошла бы в суммы1 оставшихся строк, при условии сумма1<=сумма2.
То есть в итоге получилась бы таблица

1  1       35   35
2  1       12   15

Может вопрос и абсурдный, но весь вечер голову ломаю как это сделать
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Как бы сгруппировать таблицу по хитрому
Ответ #1 - 28. Октября 2010 :: 00:57
Печать  
kalleka писал(а) 27. Октября 2010 :: 19:34:
а сумма1 не вошедших срок, вошла бы в суммы1 оставшихся строк, при условии сумма1<=сумма2.
То есть в итоге получилась бы таблица

1  1       35   35
2  1       12   15

Не пойму, как описание стыкуется с результатом?
  • Условие сумма1<=сумма2 у тебя выполняется всегда, но сумма1 меняется только раз - почему?
  • Как ты получил 35 в первой строке? Если это сумма1 не вошедших срок, то 10 + 12 = 35?  Ужас
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как бы сгруппировать таблицу по хитрому
Ответ #2 - 28. Октября 2010 :: 05:03
Печать  
Сумма входит как ?
"Равномерно" распределяешь по всем строкам ?
Или любой ?
А так, - тупо 1 цикл, замена пер=2 на 1 и свернуть.., всё собственно.
  
Наверх
 
IP записан
 
kalleka
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 10
Зарегистрирован: 02. Марта 2009
Re: Как бы сгруппировать таблицу по хитрому
Ответ #3 - 28. Октября 2010 :: 07:45
Печать  
в том то и дело, что не равномерно. Сумма1 из строк не удовлетворяющие проверке на пер =1  как бы должна размазаться по строкам, удовлетворяющим.
причем должно выполняться условие сумма1<= сумма2

если тупо заменить и свернуть получится одна строка
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как бы сгруппировать таблицу по хитрому
Ответ #4 - 28. Октября 2010 :: 08:01
Печать  
А куда девать разницу, если вся сумма не вмещается  в выбранные строки?
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
kalleka
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 10
Зарегистрирован: 02. Марта 2009
Re: Как бы сгруппировать таблицу по хитрому
Ответ #5 - 28. Октября 2010 :: 08:08
Печать  
в следующую строку))

звучит конечно как то мечтательно)
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как бы сгруппировать таблицу по хитрому
Ответ #6 - 28. Октября 2010 :: 08:33
Печать  
Это я понял. Куда девать остаток, когда строки кончатся?
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
kalleka
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 10
Зарегистрирован: 02. Марта 2009
Re: Как бы сгруппировать таблицу по хитрому
Ответ #7 - 28. Октября 2010 :: 08:43
Печать  
Можно просто опускать этот остаток либо добавлять в последнюю строку
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как бы сгруппировать таблицу по хитрому
Ответ #8 - 28. Октября 2010 :: 09:24
Печать  
Код
Выбрать все
set nocount on

declare @k1 table(
	[номер] [int],
	[пер] [int],
	[сумма1] [int],
	[сумма2] [int])

insert @k1 values(1, 1, 25, 35)
insert @k1 values(2, 1, 10, 15)
insert @k1 values(3, 2, 12, 20)

if exists (select * from tempdb..sysobjects where id = object_id(N'[tempdb]..[#k1]'))
	drop table #k1

declare @сумма1 int
declare @1 int

select @сумма1 = sum(сумма1)
from @k1
where пер <> 1

select *
into #k1
from @k1
where пер = 1

create clustered index ci on #k1 (номер)

update #k1
set @1 = case when @сумма1 < сумма2 - сумма1 then @сумма1 else сумма2 - сумма1 end
	, сумма1 = сумма1 + @1
	, @сумма1 = @сумма1 - @1
where @сумма1 > 0

select * from #k1
union all
select null, null, @сумма1, null
where @сумма1 <> 0 

  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
kalleka
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 10
Зарегистрирован: 02. Марта 2009
Re: Как бы сгруппировать таблицу по хитрому
Ответ #9 - 28. Октября 2010 :: 10:27
Печать  
Спасибо, все работает.

Теперь думаю как это прикрутить к моей конкретной ситуации

Надо рассчитать долги на каждый день. После еще надо и расчитать качественность долгов, которая зависит от времени прошедшего с момента отгрузки.
База кривая, регистр незакрывающийся (ужас конечно, но не я автор). От тормозов спасает то, что рассчитывается по одному контрагенту.

Получаю таблицу #Долги, вида
     Договор,Счет,СчетДата(Дата счета), ДатаДок(Дата дока движется, как правило расходная накладная),      Товар (по сути сумма1 из примера),      Деньги (сумма на которую погашен счет)
то есть если например 4 числа отгрузили на 2000, а 5  погасили 1000, то будет таблица

договор1 счет1 04.10.10 04.10.10 -2000 0
договор1 счет1 04.10.10 06.10.10 0      1000

у меня в текстзапроса идет что то вроде

           |(select
           |Контрагент = :ВыбКонтрагент,
           |День = ВыбДата.Dat,
           |Договор ,
           |Счет ,
           |ДатаДок = CASE WHEN (DATEDIFF ( day ,ДатаДок , ВыбДата.Dat )-$ПоследнееЗначение.Договора.СрокКредита(Договор,ВыбДата.Dat))>0 THEN DATEDIFF ( day ,ДатаДок  , ВыбДата.Dat )-$ПоследнееЗначение.Договора.СрокКредита(Договор,ВыбДата.Dat ) ELSE 0 END,
           |Товар Товар,      
           //|Контрагент ,   
           |Деньги Деньги      
           |FROM (select Dat From GrDat) as ВыбДата
           |FULL OUTER JOIN (select      
           |            Договор ,
           |            Счет,
           |            СчетДата,
           |             ДатаДок,
           |            Товар,      
           |            Деньги from #Долги) as Рег on Рег.ДатаДок <= ВыбДата.Dat";
           ТекстЗапроса=ТекстЗапроса+" 
           |) Выборка



и все нормально, но попадаются строки вида (опять же кривой регистр)
договор1 несчет1 01.10.10 01.10.10 0 500

По сути это корректировка взаиморасчетов. Но она не гасит задолженности по счетам, а ложится отдельной строкой.

И получается, что мне надо, чтобы вместо
            (select      
           |            Договор ,
           |            Счет,
           |            СчетДата,
           |             ДатаДок,
           |            Товар,      
           |            Деньги from #Долги) as
была конструкция, которая бы проблемные строки (определяются по виду документа) размазывала бы по другим строкам, начиная с самых ранних
я джойню сейчас таблицу вида
договор1 несчет1 01.10.10 01.10.10 0 500
договор1 счет1 04.10.10 04.10.10 -2000 0
договор1 счет1 04.10.10 06.10.10 0      1000

а надо 


договор1 счет1 04.10.10 04.10.10 -2000 0
договор1 счет1 04.10.10 06.10.10 0      1500
и как то надо проверять, чтобы по счету1 колонка товар не превышала колонку деньги

зы Перечитал, что тут понаписал. Надеюсь что хоть кто то поймет)))
  
Наверх
 
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как бы сгруппировать таблицу по хитрому
Ответ #10 - 29. Октября 2010 :: 17:19
Печать  
По моему надо поменять логику отчета, и понять конкретно что надо. А то как то не совсем понятно. Суть вопроса с точки зрения логики работы предприятия какая?
  
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать