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

SQL Server:Przepisz rekurencyjne CTE, aby zastąpić opcję maxrecursion w widoku

Możesz użyć tally:jest to rozwiązanie oparte na zbiorach, które działa lepiej niż rekurencja, gdy liczba iteracji wzrasta - i jest obsługiwane w widokach.

Oto podejście:

select t.objectid, t.amount, dateadd(day, x.n, t.begindate) as dt
from (
    select row_number() over (order by (select null)) - 1
    from (values(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) a(n)
    cross join (values(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) b(n)
    cross join (values(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) c(n)
) x(n)
inner join tabledatarange t
    on dateadd(day, x.n, t.begindate) <= case 
        when enddate <= convert(date, getdate()) then enddate
        else convert(date, getdate())
    end
 

Zliczanie generuje wszystkie liczby z zakresu od 0 do 999 (możesz je łatwo rozszerzyć dodając cross join s). Używamy go do „mnożenia” wierszy oryginalnej tabeli i generowania zakresu dat.

Próbowałem przepisać część, która obsługuje datę końcową. Rozumiem, że nie chcesz przyszłych dat, więc taki jest warunek w on klauzula.

Dla tych przykładowych danych:

Identyfikator obiektu | Kwota | Data rozpoczęcia | data zakończenia -------:| -----:| :--------- | :--------- 1 | 500 | 2020-12-28 | brak 2 | 35 | 2019-09-26 | 2019-10-01 3 | 200 | 2020-05-28 | 2020-06-02

Zapytanie zwraca:

obiekt | kwota | dt -------:| -----:| :--------- 1 | 500 | 2020-12-28 1 | 500 | 2020-12-29 1 | 500 | 2020-12-30 1 | 500 | 2020-12-31 2 | 35 | 2019-09-26 2 | 35 | 2019-09-27 2 | 35 | 2019-09-28 2 | 35 | 2019-09-29 2 | 35 | 2019-09-30 2 | 35 | 2019-10-01 3 | 200 | 2020-05-28 3 | 200 | 2020-05-29 3 | 200 | 2020-05-30 3 | 200 | 2020-05-31 3 | 200 | 2020-06-01 3 | 200 | 2020-06-02

Demo na DB Fiddle



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapytanie hierarchiczne w SQL Server 2005

  2. Dane wyjściowe do tabeli tymczasowej w SQL Server 2005

  3. Jak uzyskać dane wyjściowe eksportu w rzeczywistym formacie CSV w SQL Server Management Studio?

  4. Tabele tymczasowe w SQL Server 2005 nie są automatycznie usuwane

  5. Numer wystąpienia zapytania sql