Tengo un código para una tabla dinámica, pero también quiero multiplicar (x) que compre otra tabla si cumple con los criterios.

select *
from
(SELECT 
        year(dteOccupiedDate) as [year],
        moveincharge as type ,
        left(datename(month,dteOccupiedDate),3)as [month], 
        MoveInCharge 
    FROM dav.Gainshare where strTenancyType = 'LTO' and dteOccupiedDate between '2020-04-01' and '2021-03-31' and moveincharge is not null
    ) as s
    PIVOT
(
    count(moveincharge)
    FOR [month] IN (jan, feb, mar, apr, 
    may, jun, jul, aug, sep, oct, nov, dec)
)AS pvt
order by year

Este código muestra


year    type            jan feb mar     apr     may     jun     jul     aug     sep     oct     nov     dec
2020    Single          0   0   0       5       1       4       12      12      6       0       0       0
2020    Family          0   0   0       5       1       4       12      12      6       0       0       0
2020    Early-leave     0   0   0       5       1       4       12      12      6       0       0       0
2020    Re-house        0   0   0       5       1       4       12      12      6       0       0       0


Son 4 tipos de carga de movimiento diferentes cuando cae en ese tipo lo quiero X veces por

Simple (150)

Familia (200)

Vivienda (130)

Licencia anticipada (140)

También puedo convertirlos en una mesa si eso lo hace mejor. quiero ver esto

year    type           jan  feb     mar     apr     may     jun     jul     aug     sep     oct     nov     dec
2020    Single          0   0   0       750     150     600     1800    1800    900       0       0       0

Por ejemplo, el tipo individual para julio es 12 x 150 porque solo vale 150 cada uno y hay 12 en ese mes

0
SQL_Noob 18 oct. 2020 a las 16:38

1 respuesta

La mejor respuesta

Prefiero la agregación condicional a la sintaxis pivot personalizada. Esto se logra fácilmente con un join:

select year(gs.dteOccupiedDate) as [year],
        sum(case when month(gs.dteOccupiedDate) = 1 then v.charge else 0 end) as jan,
        sum(case when month(gs.dteOccupiedDate) = 2 then v.charge else 0 end) as feb,
       . . .
from dav.Gainshare gs join
     (values ('single', 150), ('family', 200), . . .
     ) v(moveincharge, charge)
     on gs.movincharge = v.ovincharge
where gs.strTenancyType = 'LTO' and
      gs.dteOccupiedDate between '2020-04-01' and '2021-03-31' and 
      gs.moveincharge is not null
group by year(gs.dteOccupiedDate);

Nota: Esto devolverá dos filas, una para 2020 y otra para 2021. Eso es lo que hace su consulta. Es posible que desee eliminar el group by y el year del select.

1
Gordon Linoff 18 oct. 2020 a las 14:03