369 messaggi dal 08 dicembre 2006
Buonasera,
come da titolo, vorrei i risultati di una query in una sola riga. Le query sono 2 e separatamente funzionano, ma non riesco in nessun modo ad assemblarle insieme. La struttura è la seguente:
SELECT 
        SezioneID, 
        Desc_Prod, 
        sample.products.VETTURA AS VetturaID, 
        SUM(DISTINCT(mtscrap)) AS scartoMetri        
FROM flB.flB_prod AS PROD
JOIN SAMPLE.PRODUCTS 
ON (sample.products.SKU = PROD.SEZIONEID) AND (sample.products.LINEA = 'FLB') 
JOIN FLB.flB_causali AS CAUSALI
ON (PROD.SEZIONEID = CAUSALI.IDSEZIONE)   AND 
(DATASTARTPRG BETWEEN '2014-06-09' AND '2014-06-13') AND
PROD.TURNO = CAUSALI.IDTURNO AND
PROD.ID_PROG = CAUSALI.ID_PROG
WHERE giorno BETWEEN '2014-06-09' AND '2014-06-13' AND
(CAUSALI.AVAILABLECAUSA_1 LIKE ('%CAUSA-1%') OR
CAUSALI.AVAILABLECAUSA_2 LIKE ('%CAUSA-1%') OR
CAUSALI.AVAILABLECAUSA_3 LIKE ('%CAUSA-1%') OR
CAUSALI.AVAILABLECAUSA_4 LIKE ('%CAUSA-1%') OR
CAUSALI.AVAILABLECAUSA_5 LIKE ('%CAUSA-1%') OR
CAUSALI.AVAILABLECAUSA_6 LIKE ('%CAUSA-1%'))
GROUP BY SezioneID


e l'altra query

SELECT 
        SezioneID, 
        Desc_Prod, 
        sample.products.VETTURA AS VetturaID, 
        SUM(DISTINCT(mtscrap)) AS scartoMetri        
FROM flB.flB_prod AS PROD
JOIN SAMPLE.PRODUCTS 
ON (sample.products.SKU = PROD.SEZIONEID) AND (sample.products.LINEA = 'FLB') 
JOIN FLB.flB_causali AS CAUSALI
ON (PROD.SEZIONEID = CAUSALI.IDSEZIONE)   AND 
(DATASTARTPRG BETWEEN '2014-06-09' AND '2014-06-13') AND
PROD.TURNO = CAUSALI.IDTURNO AND
PROD.ID_PROG = CAUSALI.ID_PROG
WHERE giorno BETWEEN '2014-06-09' AND '2014-06-13' AND
(CAUSALI.AVAILABLECAUSA_1 LIKE ('%CAUSA-2%') OR
CAUSALI.AVAILABLECAUSA_2 LIKE ('%CAUSA-2%') OR
CAUSALI.AVAILABLECAUSA_3 LIKE ('%CAUSA-2%') OR
CAUSALI.AVAILABLECAUSA_4 LIKE ('%CAUSA-2%') OR
CAUSALI.AVAILABLECAUSA_5 LIKE ('%CAUSA-2%') OR
CAUSALI.AVAILABLECAUSA_6 LIKE ('%CAUSA-2%'))
GROUP BY SezioneID


sono praticamente uguali, cambia solo la clausola WHERE, ma non riesco ad assemblarle per ottenere il risultato in una sola riga.
Grazie in anticipo.
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
forse non ho ben compreso, ma mi pare che le 2 querie possano benissimo riscriversi in una unica mediando il filtro di where...
tipicamente,
WHERE giorno BETWEEN '2014-06-09' AND '2014-06-13' 
  AND
  (
  (CAUSALI.AVAILABLECAUSA_1 LIKE ('%CAUSA-1%') OR
    CAUSALI.AVAILABLECAUSA_2 LIKE ('%CAUSA-1%') OR
    CAUSALI.AVAILABLECAUSA_3 LIKE ('%CAUSA-1%') OR
    CAUSALI.AVAILABLECAUSA_4 LIKE ('%CAUSA-1%') OR
    CAUSALI.AVAILABLECAUSA_5 LIKE ('%CAUSA-1%') OR
    CAUSALI.AVAILABLECAUSA_6 LIKE ('%CAUSA-1%'))
  OR
  (CAUSALI.AVAILABLECAUSA_1 LIKE ('%CAUSA-2%') OR
    CAUSALI.AVAILABLECAUSA_2 LIKE ('%CAUSA-2%') OR
    CAUSALI.AVAILABLECAUSA_3 LIKE ('%CAUSA-2%') OR
    CAUSALI.AVAILABLECAUSA_4 LIKE ('%CAUSA-2%') OR
    CAUSALI.AVAILABLECAUSA_5 LIKE ('%CAUSA-2%') OR
    CAUSALI.AVAILABLECAUSA_6 LIKE ('%CAUSA-2%'))  
   )    
GROUP BY SezioneID


dove la prima parte del filtro resta valida per entrambe le formulazioni, cui poi si aggiunge il filtro per '%CAUSA-1%' OR '%CAUSA-2%'

il piano di esecuzione sara' ovviamente "pessimo" vista la parziale denormalizzazione nei 6 attributi AVAILABLECAUSA_X, ma dovrebbe risolvere il problema...
ho capito bene le tue esigenze?

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
369 messaggi dal 08 dicembre 2006
Ciao Andrea e innanzitutto grazie per la risposta.
In pratica devo calcolare due volte
SUM(DISTINCT(mtscrap)) AS scartoMetri
quando nella clausola WHERE i campi AVAILABLECAUSA_X contengano prima
'%CAUSA-1%'
e poi
'%CAUSA-1%'
e avere i risultati sulla stessa riga. Ho provato a seguire il tuo consiglio, ma ottengo valori uguali purtroppo.
Modificato da inactive il 11 luglio 2014 23.15 -
156 messaggi dal 01 dicembre 2010

...... In pratica devo calcolare due volte
SUM(DISTINCT(mtscrap)) AS scartoMetri

..... quando nella clausola WHERE i campi AVAILABLECAUSA_X contengano prima .......
...... e avere i risultati sulla stessa riga. .....


potrebbe essere a livello di struttura cosi:

SELECT
TuoiCampi
Sum(  If ( TuaCondizione1 = True ;   TuoValore   ;   0  )   )
Sum(  If ( TuaCondizione2 = True ;   TuoValore   ;   0  )   )
FROM
.... Eccetera
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
si, forse
SUM (CASE WHEN CAUSALI.AVAILABLECAUSA_1 LIKE ('%CAUSA-2%') OR
    CAUSALI.AVAILABLECAUSA_2 LIKE ('%CAUSA-2%') OR
    CAUSALI.AVAILABLECAUSA_3 LIKE ('%CAUSA-2%') OR
    CAUSALI.AVAILABLECAUSA_4 LIKE ('%CAUSA-2%') OR
    CAUSALI.AVAILABLECAUSA_5 LIKE ('%CAUSA-2%') OR
    CAUSALI.AVAILABLECAUSA_6 LIKE ('%CAUSA-2%') THEN [mtscrap] ELSE 0 END ) AS [scartoMetri_CAUSA_2]

puo' risolvere...
saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
369 messaggi dal 08 dicembre 2006
Grazie per il vostro aiuto , mi è stato davvero utile. Una ultima domanda prima di chiudere questo thread: se volessi aggiungere un altra somma circoscrivendo il calcolo in un range di date diverso da quello specificato nella WHERE come dovrei muovermi? Grazie in anticipo
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
in questo caso dovresti innestare una subquery in quanto la proiezione "generale" non ti ritorna i dati che cerchi per questo subset...
saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
369 messaggi dal 08 dicembre 2006
Ciao, cioè intendi una SELECT annidata, che abbia la stessa struttura della SELECT principale? Grazie

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.