Jak extrapolovat data v SQL Server k výpočtu denní počítá?

0

Otázka

To je to, jak data vypadají. To je dlouhý stůl

enter image description here

Potřebuji vypočítat počet lidí zaměstnaných ve dne

enter image description here

Jak napsat SQL Server logiku, aby si tento výsledek? Jsem treid vytvořit DATA, tabulky a pak připojit, ale to způsobilo chybu, protože tabulka je příliš velká. Potřebuji rekurzivní logiku?

sql sql-server tsql
2021-11-23 19:56:48
4
0

Pro budoucí otázky, neposílejte obrázky dat. Místo toho, využít služby jako dbfiddle. Budu tak či onak přidat skici za odpověď, s lépe připravené otázku jste mohli získat úplnou odpověď. Každopádně tady to je:

-- extrema is the least and the greatest date in staff table
with extrema(mn, mx) as (
    select least(min(hired),min(retired)) as mn
         , greatest(max(hired),max(retired)) as mx
    from staff
), calendar (dt) as (
    -- we construct a calendar with every date between extreme values
    select mn from extrema
    union all
    select dateadd(day, 1, d)
    from calendar
    where dt < (select mx from extrema)
)
-- finally we can count the number of employed people for each such date
select dt, count(1) 
from calendar c 
join staff s
    on c.dt between s.hired and s.retired
group by dt; 

Pokud se ocitnete dělat tento druh výpočtu často, je to dobrý nápad, vytvořit kalendář stolní. Můžete přidat další atributy k tomu tak, jako když je to den uprostřed týdne atd.

S omezením jako:

CHECK(hired <= retired)

první část lze zjednodušit na:

with extrema(mn, mx) as (
    select min(hired) as mn
         , max(retired) as mx
    from staff
),
2021-11-23 20:45:14
0

Za předpokladu, že Stávající Zaměstnanci NULL datum odchodu do důchodu

Declare @Date1 date = '2015-01-01'
Declare @Date2 date = getdate()

Select A.Date
      ,HeadCount = count(B.name)
 From ( Select Top (DateDiff(DAY,@Date1,@Date2)+1) 
               Date=DateAdd(DAY,-1+Row_Number() Over (Order By (Select Null)),@Date1) 
         From  master..spt_values n1,master..spt_values n2
      ) A
 Left Join YourTable B on A.Date >= B.Hired and A.Date <= coalesce(B.Retired,getdate())
 Group BY A.Date
2021-11-23 20:34:49
0

Potřebujete kalendář stolní za to. Začnete s kalendářem, a ODEŠEL se PŘIPOJIT všechno ostatní, použití BETWEEN logika.

Můžete použít skutečné tabulky. Nebo můžete generovat za běhu, jako je tento:

WITH
    L0 AS ( SELECT c = 1
            FROM (VALUES(1),(1),(1),(1),(1),(1),(1),(1),
                        (1),(1),(1),(1),(1),(1),(1),(1)) AS D(c) ),
    L1 AS ( SELECT c = 1 FROM L0 A, L0 B, L0 C, L0 D ),
    Nums AS ( SELECT rownum = ROW_NUMBER() OVER(ORDER BY (SELECT 1))
              FROM L1 ),
    Dates AS (
      SELECT TOP (DATEDIFF(day, '20141231', GETDATE()))
        Date = DATEADD(day, rownum, '20141231')
      FROM Nums
    )

SELECT
  d.Date,
  NumEmployed = COUNT(*)
FROM Dates d
JOIN YourTable t ON d.Date BETWEEN t.Hired AND t.Retired
GROUP BY
  d.Date;

Pokud vaše data se časová složka pak budete muset použít >= AND < logika

2021-11-23 20:49:37
0

Pokuste se omezit rozsah své data tabulky. V tomto příkladu mám tabulku data jménem TallyStickDT.

SELECT dt, COUNT(name)
FROM (
    SELECT dt
    FROM tallystickdt
    WHERE dt >= (SELECT MIN(hired) FROM #employees)
    AND dt <= GETDATE()
) A
LEFT OUTER JOIN #employees E ON A.dt >= E.Hired AND A.dt <= e.retired
GROUP BY dt
ORDER BY dt
2021-11-23 20:44:03

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................