2

У меня есть нижний запрос, который отлично работает в 2012 году, поскольку он использует функции 2012 года. Может ли кто-нибудь выполнить ту же самую работу запроса в 2008 году с тем же результатом? Я хочу получить данные заполнения ковша из таблицы Filler в таблицу Bucket. Я получаю сообщение об ошибке при запуске его в SQL 2008. The Parallel Data Warehouse (PDW) features are not enabledПреобразование SQL Server 2012 CTE в SQL Server 2008

declare @Buckets table (ID char(2), FullCapacity int) 
declare @Filler table (ID char(2), Filler int) 

insert into @Buckets values 
('B1', 100), 
('B2', 50), 
('B3', 70) 

insert into @Filler values 
('F1', 90), 
('F2', 70), 
('F3', 40), 
('F4', 20) 

;with fillerCte as 
(
select 
ID, 
Filler, 
sum(Filler) over (order by ID) as TotalFill 
from @Filler 
), 
BucketCte as 
(
select 
ID, 
FullCapacity, 
sum(FullCapacity) over (order by ID) - FullCapacity as RunningTotalCapacity 
from @Buckets 
) 
select 
b.ID, 
b.FullCapacity, 
case 
when f.TotalFill < b.RunningTotalCapacity then 0 
when f.TotalFill > b.RunningTotalCapacity + b.FullCapacity then b.FullCapacity 
else f.TotalFill - b.RunningTotalCapacity 
end as CurrentAmount 
from fillerCte as f 
cross join BucketCte as b 
order by f.ID, b.ID 

Выходная таблица должна иметь ниже показывает процесс заполнения.

ID | FullCapacity | CurrentAmount  
---+--------------+-------------- 
B1 | 100  | 90   
B2 |  50  |  0  
B3 |  70  |  0 
---+--------------+-------------- 
B1 | 100  | 100   
B2 |  50  | 50 
B3 |  70  | 10 
---+--------------+-------------- 
B1 | 100  | 100  
B2 |  50  | 50  
B3 |  70  | 50 
---+--------------+-------------- 
B1 | 100  | 100   
B2 |  50  | 50  
B3 |  70  | 70 
+0

Я получаю ошибку ниже при выполнении ее в SQL 2008. Функции Parallel Data Warehouse (PDW) не включены. – user2123852

+2

Единственное, что я вижу, что в версии 2008 не поддерживается, - это общая сумма. Здесь, в SO, вы можете найти множество примеров того, как реализовать общее количество в SQL Server без использования оконной функции. –

+0

Пожалуйста, отредактируйте свой вопрос, чтобы добавить информацию - он будет более четким, чем публикация комментариев. – Filburt

ответ

1

Чтобы сделать такой же запрос в SQL Server 2008, вы должны рассчитать текущую сумму в два этапа, первый шаг должен ранжировать строки с помощью ROW_NUMBER() OVER(ORDER BY ID), а затем использовать номер строки для расчета нарастающим итогом :

;WITH fillerCte as 
(
    SELECT 
    ID, 
    Filler, 
    ROW_NUMBER() OVER(ORDER BY Id) AS RN 
    FROM @Filler 
), FillerRT 
AS 
(
    SELECT 
    f1.ID, 
    f1.Filler, 
    SUM(f2.Filler) AS TotalFill 
    FROM fillerCte AS f1 
    INNER JOIN fillerCte AS f2 ON f2.rn <= f1.rn 
    GROUP BY f1.ID, f1.Filler 
), BucketCte as 
(
    SELECT 
    ID, 
    FullCapacity, 
    ROW_NUMBER() OVER(ORDER BY ID) AS RN 
    FROM @Buckets 
),BucketRN 
AS 
(
    SELECT 
    b1.ID, 
    b1.FullCapacity, 
    SUM(b2.FullCapacity) - b1.FullCapacity AS RunningTotalCapacity 
    FROM BucketCte AS b1 INNER JOIN BucketCte AS b2 ON b2.RN <= b1.RN 
    GROUP BY b1.ID, b1.FullCapacity 
) 
select 
b.ID, 
b.FullCapacity, 
case 
when f.TotalFill < b.RunningTotalCapacity then 0 
when f.TotalFill > b.RunningTotalCapacity + b.FullCapacity then b.FullCapacity 
else f.TotalFill - b.RunningTotalCapacity 
end as CurrentAmount 
from FillerRT as f 
cross join BucketRN as b 
order by f.ID, b.ID; 

Это даст вам точный результат вашего запроса.

+0

Спасибо. оно работает. просто коррекция. замените «сумма (Filler) поверх (по ID) как TotalFill» в качестве Filler as TotalFill – user2123852

+0

@ user2123852 - Извините, я забыл удалить его, попробуйте изменить его снова, он будет работать нормально. –

Смежные вопросы