SQL WITH STATEMENT

di il
2 risposte

SQL WITH STATEMENT

Buongiorno.
Ciao a tutti sono nuovo del forum.
Vorrei creare un risultato in cui, in maniera aggregata, per ogni articolo riporta l'ABC ovvero il numero di occorrenze in cui la produttività è stata maggiore o compresa tra certe percentuali.
Ho provato a creare una tabella temporanea per aggregare i dati al volo ed estrarre i risultati. Tuttavia quello che mi servirebbe davvero sarebbe farlo 2 volte ma temo che la clausola WITH possa essere usata soltanto una volta e quindi non possa essere ANNIDATA.
Qualcuno mi sa dire se sbaglio formalmente la query oppure SQL non lo permetta? (della select finale ho indicato solo uno stralcio).

Pensavo che fosse possibile farlo anche con un solo passaggio ma purtroppo in questo modo i risultati vengono moltiplicati e non aggregati (spero di essermi spiegato)

Grazie

WITH TAB AS (
WITH TABELLA AS (
select
codparte AS 'ART',
desparte AS 'DEX',
s_odl.datainizio AS 'DATA',
s_odl.turno AS 'T',
sum(s_odl.lordo) AS 'QTA',
round(sum(s_odl.durata)/3600,2) AS 'ORE',
round(sum(s_odl.lordo)/(sum(s_odl.durata)/3600),0) AS 'PZH',
round(3600/avg(tcicmedstd),0) AS 'STD'
from l_odl

left outer join s_odl on
l_odl.cododl = s_odl.cododl and
durata > 0 and
s_odl.statocdl not in (8,27,29,4)

where
l_odl.codcdl='C03' and
dtinieff>=getdate()-360
group by
codparte,
desparte,
3600/tcicmedstd,
s_odl.datainizio,
s_odl.turno)

SELECT
ISNULL(ART, 'TOT') AS 'ARTICOLO',
COUNT(CASE WHEN PZH > STD*0.95 THEN 1 END) AS P95,
COUNT(CASE WHEN PZH BETWEEN (STD*0.75) AND (STD*0.95) THEN 1 END) AS P75,
COUNT(CASE WHEN PZH BETWEEN (STD*0.50) AND (STD*0.75) THEN 1 END) AS P50,
COUNT(CASE WHEN PZH < STD*0.50 THEN 1 END) AS P00
FROM TABELLA

GROUP BY
ART WITH ROLLUP)

SELECT
ARTICOLO,
(SELECT DEX FROM TABELLA WHERE ART=ARTICOLO) AS 'DESCRIZIONE', [...]
FROM TAB

2 Risposte

  • Re: SQL WITH STATEMENT

    Salve,
    puoi provare a non "nidificare" ma semplicemente ad utilizzare le common table expression in cascata, trivialmente
    
    WITH TABELLA AS (
        SELECT ....
            FROM ...
                LEFT JOIN ....
            WHERE ....
        ),
    TAB AS (
        SELECT ....
            FROM TABELLA AS cte     ' <- qui utilizzi la CTE precedente
                JOIN ...
            WHERE ....
        )
        SELECT ....
            FROM TAB                     ' <- qui utilizzi la CTE "finale", magari joinandola con altro, se serve...
            ORDER BY ...;
    
    nel senso che costruisci "man mano" le subquery e le utilizzi o immediatamente successivamente o anche "in fondo" nella proiezione finale, come meglio ti serve...

    salutoni
    --
    Andrea
  • Re: SQL WITH STATEMENT

    Grazie Andrea... in questo momento sono impegnato in altri lavori. Spero domani di potermici dedicare.
    Grazie per ora e ti faccio sapere
Devi accedere o registrarti per scrivere nel forum
2 risposte