ashishkumarrai Ответов: 1

Преобразование запроса SQL server 2012 в SQL 2008


У меня есть приведенный ниже запрос, который отлично работает в 2012 году, так как он использует функции 2012 года. Может ли кто-нибудь заставить точно такой же запрос работать в 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


Что я уже пробовал:

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

Herman&lt;T&gt;.Instance

В чем именно заключается проблема?

ashishkumarrai

Я получаю ошибку при выполнении его в SQL 2008.Параллельное хранилище данных (упаковки) не включена

ashishkumarrai

выход, который я ищу.
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

1 Ответов

Рейтинг:
1

Alex Banu

Я нашел это :

Цитата:
Это ошибка синтаксического анализатора, которая существует только в SQL Server 2008. Не PDW-версии SQL Server до 2012 года не поддерживают предложение ORDER BY с агрегатными функциями, такими как MIN


новые подробности

У вас здесь нет SQL 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 as b_ID,
    f.ID as f_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
    into #tmp
from fillerCte as f
cross join BucketCte as b

SELECT f_ID as ID, FullCapacity,CurrentAmount
FROM 
 #tmp
ORDER BY f_ID, b_ID