Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL Server — Łączna suma, która resetuje się po napotkaniu 0

W SQL Server 2008 masz poważne ograniczenia, ponieważ nie możesz używać funkcji analitycznych. Poniższe nie są skuteczne, ale rozwiążą Twój problem:

with tg as (
      select t.*, g.grp
      from t cross apply
           (select count(*) as grp
            from t t2
            where t2.pk <= t.pk and t2.pk = 0
           ) g
     )
select tg.*, p.running_price
from tg cross apply
     (select sum(tg2.price) as running_price
      from tg tg2
      where tg2.grp = tg.grp and tg2.pk <= tg.pk
     ) p;

Niestety, przed SQL Server 2012 najbardziej wydajne rozwiązanie może obejmować kursory. W SQL Server 2012+ wystarczy:

select t.*,
       sum(price) over (partition by grp order by pk) as running_price
from (select t.*,
             sum(case when price = 0 then 1 else 0 end) over (order by pk) as grp
      from t
     ) t;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy można używać agregatów zdefiniowanych przez użytkownika (clr) z funkcjami okna (over)?

  2. Jaka jest różnica między VARCHAR i NVARCHAR w serwerze SQL - SQL Server / T-SQL Tutorial Część 32

  3. Wdrażanie wskaźnika wydajności programu SQL Server dla zapytań, procedur składowanych i wyzwalaczy

  4. Nie znaleziono bliskich odpowiedników w CONTAINSTABLE

  5. Jak wstawić tabelę danych do tabeli bazy danych SQL Server?