Так что я знаю, что это было несколько сделано до смерти, но я действительно борюсь с этим. На работе у меня есть SQL Server 2008, и меня попросили сделать промежуточный итог, поэтому для меня нет оконных функций. Это означает, что я должен делать это старым школьным способом, поэтому, чтобы научиться этому, я использую базу данных AdventureWorks 2012 и пытаюсь сделать промежуточный итог totaldue
для каждого salesorderid
на customerid
в таблице sales.salesorderheader. Соответствующие столбцы:
salesorderid int not null
customerid int not null
totaldue money not null
Вот что у меня есть до сих пор:
select soh1.salesorderid
, soh1.customerid
, soh1.totaldue
, sum(soh2.totaldue) 'running_total'
from sales.salesorderheader soh1
inner join sales.salesorderheader soh2 on soh1.totaldue <= soh2.totaldue
and soh1.customerid = soh2.customerid
group by soh1.customerid, soh1.salesorderid, soh1.totaldue
order by soh1.customerid, soh1.salesorderid;
Я получаю следующее (первые 10 строк):
salesorderid customerid totaldue runningtotal
43793 11000 3756.989 3756.989
51522 11000 2587.8769 9115.1341
57418 11000 2770.2682 6527.2572
43767 11001 3729.364 3729.364
51493 11001 2674.0227 6403.3867
43736 11002 3756.989 3756.989
51238 11002 2535.964 8966.0143
53237 11002 2673.0613 6430.0503
43701 11003 3756.989 3756.989
51315 11003 2562.4508 8993.9155
57783 11003 2674.4757 6431.4647
Я чувствую, что я близок - я заметил, что когда есть только два заказа на продажу для данного идентификатора клиента, промежуточная сумма вычисляется правильно. Однако, когда их 3 или больше, это становится дерьмом.
Я посмотрел на выход из объединения для customerid = 11000, чтобы понять, почему второй и третий идентификаторы порядка (51522 и 57418) не вычисляются правильно. Я запустил следующий код:
select soh1.salesorderid
, soh1.customerid
, soh1.totaldue
, soh2.salesorderid
, soh2.customerid
, soh2.totaldue
from sales.salesorderheader soh1
inner join sales.salesorderheader soh2 on soh1.totaldue <= soh2.totaldue
and soh1.customerid = soh2.customerid
where soh1.customerid = 11000
order by soh1.customerid, soh1.salesorderid;
и я получаю это:
salesorderid customerid totaldue salesorderid customerid totaldue
43793 11000 3756.989 43793 11000 3756.989
51522 11000 2587.8769 43793 11000 3756.989
51522 11000 2587.8769 51522 11000 2587.8769
**51522 11000 2587.8769 57418 11000 2770.2682**
57418 11000 2770.2682 57418 11000 2770.2682
57418 11000 2770.2682 43793 11000 3756.989
Я вижу, что проблема в 4-й строке, где она вводит строку, которую я не хочу, а затем для salesorderid 57418 отсутствует одна строка. Я подозреваю, что проблема связана с моим соединением, но я не могу понять логику, которая привела бы к правильным строкам.
Я попросил использовать SQL 2012 или более позднюю версию, но не в кости. Пожалуйста помоги!