none
Recupero un diverso numerico di righe ad ogni campo in più considerato nella query ... RRS feed

  • Domanda

  • Ciao a tutti, sembra un film dell'horror, nella seguente query aggiungendo di volta in volta i campi già coinvolti nelle JOIN ottengo un numero diverso di righe:

    SELECT YEAR(CONVERT(datetime, T0.[DocDate])) 'Anno', T1.[Quantity] 'Quantita', (T1.[Quantity] * (T1.Price/T0.DocRate)) 'Valore'--,
    --T1.[SlpCode] 'Agente', T2.[U_CAP_POLIMERO] 'Polimero', T2.[U_CAP_CARATTERISTICA] 'Caratteristica'
    
    FROM A T0  
    INNER JOIN B T1 ON T0.[DocEntry] = T1.[DocEntry]
    INNER JOIN C T2 ON T1.[ItemCode] = T2.[ItemCode]
    
    WHERE T0.U_CAP_CAUS <> 29 AND T0.[CardCode] <> 'C00000' AND T2.[ItmsGrpCod] = 101 
    AND (YEAR(CONVERT(datetime, T0.[DocDate])) BETWEEN 2015 AND 2016)
    
    UNION
    
    SELECT YEAR(CONVERT(datetime, T0.[DocDate])) 'Anno', (-1 * T1.[Quantity]) 'Quantita', (-1 * (T1.[Quantity] * (T1.Price/T0.DocRate))) 'Valore'--,
    --T1.[SlpCode] 'Agente', T2.[U_CAP_POLIMERO] 'Polimero'--, T2.[U_CAP_CARATTERISTICA] 'Caratteristica', T1.[SlpCode] 'Agente'
    
    FROM X T0  
    INNER JOIN Y T1 ON T0.[DocEntry] = T1.[DocEntry]
    INNER JOIN Z T2 ON T1.[ItemCode] = T2.[ItemCode]
    
    WHERE T0.U_CAP_CAUS <> 29 AND T0.[CardCode] <> 'C00000' AND T2.[ItmsGrpCod] = 101 
    AND (YEAR(CONVERT(datetime, T0.[DocDate])) BETWEEN 2015 AND 2016)

    Spero di non soffrire di allucinazioni!

    Comunque la query qui sopra mi fornisce n1 righe se includo il campo 'Agente' ottengo n2 righe se includo anche il campo 'Polimero' e così via in una successione crescente.

    Datemi una dritta perché non so dove sbattere la testa!!!

    Grazie,

    Paolo


    • Modificato MrPaolog giovedì 23 febbraio 2017 14:05 errore di scrittura
    giovedì 23 febbraio 2017 14:03

Risposte

  • Salve MrPaolog,

    l'operatore union restituisce il set di righe in modo ordinato e con valori distinti, va da se che con l'aggiunta di un nuovo campo il numero di righe può cambiare.

    Se questo risultato non è quello desiderato utilizza l'operatore

    UNION ALL

    per maggiori info vedi: UNION (Transact-SQL)

    Ciao
    Giorgio Rancati

    • Proposto come risposta Luca Bruno venerdì 24 febbraio 2017 05:45
    • Contrassegnato come risposta MrPaolog venerdì 24 febbraio 2017 10:28
    giovedì 23 febbraio 2017 19:13
    Moderatore

Tutte le risposte

  • Salve MrPaolog,

    l'operatore union restituisce il set di righe in modo ordinato e con valori distinti, va da se che con l'aggiunta di un nuovo campo il numero di righe può cambiare.

    Se questo risultato non è quello desiderato utilizza l'operatore

    UNION ALL

    per maggiori info vedi: UNION (Transact-SQL)

    Ciao
    Giorgio Rancati

    • Proposto come risposta Luca Bruno venerdì 24 febbraio 2017 05:45
    • Contrassegnato come risposta MrPaolog venerdì 24 febbraio 2017 10:28
    giovedì 23 febbraio 2017 19:13
    Moderatore
  • Grazie mille! Ho Risolto. In pratica se ho capito bene l'articolo sopra indicato, utilizzare la UNION (senza ALL) vuol dire ottenere solo i record che coinvolgono i campi elencati nella SELECT, ed ecco il motivo dell'aumento del numero di record all'inserimento di ulteriori campi. Mentre la UNION ALL considera sempre tutti record coinvolti nella query. Ciao Paolo
    venerdì 24 febbraio 2017 10:27
  • Salve MrPaolog,

    è più semplice, la UNION elimina le righe duplicate dal risultato.

    Se hai in totale 100 righe con il campo agente contenente lo stesso valore ad es. 'Rossi Alberto'  e richiedi nelle select il solo campo Agente, con la UNION otterrei una sola riga , con la UNION ALL otterrai tutte le 100 righe.

    Ciao
    Giorgio Rancati

    venerdì 24 febbraio 2017 10:42
    Moderatore