sql >> Databáze >  >> RDS >> Sqlserver

SQL:Akumulativní sloupce a součet napříč řádkem

Dvě položky:1) Gordonova odpověď byla prakticky na místě, kromě úrovně=0. Mělo by být Level=1

2) Nejsem přesvědčen, že poslední řádek vašich požadovaných výsledků je správný, myslím, že jste pryč do 10. Pokud se nemýlím, dejte mi vědět a já to znovu navštívím.

Declare @Table table (Profile varchar(25),Level int,CHgt int,BHgt int, SHgt int, Z int)
Insert into @Table values
('ABCD1' , 1  , 15 , 11 , 50 , 0),
('ABCD1' , 2  , 15 , 11 , 70 , 0),
('ABCD1' , 3  , 15 , 11 , 70 , 0),
('ABCD2' , 1  , 15 , 11 , 60 , 0),
('ABCD2' , 2  , 15 , 11 , 80 , 0),
('ABCD2' , 3  , 15 , 11 , 80 , 0),
('ABCD3' , 1  , 15 , 11 , 40 , 0),
('ABCD3' , 2  , 15 , 11 , 60 , 0),
('ABCD3' , 3  , 15 , 11 , 60 , 0)

select A.Profile
      ,A.Level
      ,A.CHgt
      ,A.BHgt
      ,A.SHgt
      ,B.Bhgt2
      ,Shgt2 = case when Level = 1 then 0 else SHgt2 end
      ,Z     = CHgt + B.Bhgt2 + case when level = 1 then 0 else SHgt2 end 
From @Table A 
Cross Apply (Select Bhgt2 = sum(Bhgt)
                   ,SHgt2 = sum(SHgt)
              From  @Table B
              Where B.Profile = A.Profile and A.Level >= B.Level 
            ) B;
 

Vrátí

Profile Level CHgt BHgt SHgt Bhgt2 Shgt2 Z ABCD1 1 15 11 50 11 0 26 ABCD1 2 15 11 70 22 120 157 ABCD1 3 15 11 70 33 190 238 ABCD2 1 15 11 60 11 0 26 ABCD2 2 15 11 80 22 140 177 ABCD2 3 15 11 80 33 220 268 ABCD3 1 15 11 40 11 0 26 ABCD3 2 15 11 60 22 100 137 ABCD3 3 15 11 60 33 160 208

  1. Jak nakonfigurovat SELinux pro PostgreSQL a TimescaleDB

  2. Jak převedu binární pgdump (komprimovaný) na prostý soubor SQL?

  3. Nemohu vytvořit MySQL TRIGGER, když používám IS NOT NULL

  4. Vyžaduje se SQL dotaz s ON DUPLICATE KEY UPDATE