raggruppare e girare i dati in colonne

max1974

Utente Attivo
7 Mar 2013
106
0
16
salve ragazzi come al solito sono a chiedere il vostro impagabile aiuto.
in questo caso ho una query che viene composta attraverso filtri e raggruppamenti ed alla fine estraggo un set di dati come questo
PHP:
[
{"Qta":"1","Cod_Art":"123","DDif":"Rotto"},
{"Qta":"2","Cod_Art":"123","DDif":"Spaccato"},
{"Qta":"3","Cod_Art":"123","DDif":"Deformato"},
{"Qta":"4","Cod_Art":"123","DDif":"Deformato"},

{"Qta":"1","Cod_Art":"456","DDif":"Rotto"},
{"Qta":"2","Cod_Art":"456","DDif":"Strappato"},
{"Qta":"3","Cod_Art":"456","DDif":"Deformato"},

]
lavorando su questa query che estrae il tutto tipo :
PHP:
query1= "select qr.Qta, qr.Cod_Art,qr.DDif from qr"
gradirei girare i dati a parità di Cod_Art distinti per DDif
e sommare i dati a parità di Cod_Art e di DDif
o meglio gradirei ottenere qualcosa di questo tipo:
PHP:
[
{"Cod_Art":"123","DDif_1":"Rotto","Qta_1":"1","DDif_2":"Spaccato","Qta_2":"2","DDif_3":"Deformato","Qta_3":"7","DDif_4":"Strappato","Qta_4":"0"},
{"Cod_Art":"456","DDif_1":"Rotto","Qta_1":"1","DDif_2":"Spaccato","Qta_2":"0","DDif_3":"Deformato","Qta_3":"3","DDif_4":"Strappato","Qta_4":"2"},
]
spero di essermi spiegato bene.......
ora non so se dico una fesseria ma esistono gli operatori PIVOT e UNPIVOT .......
potete aiutarmi per favore......grazie 1000 come sempre
 
Ultima modifica:

max1974

Utente Attivo
7 Mar 2013
106
0
16
salve ragazzi come al solito sono a chiedere il vostro impagabile aiuto.
in questo caso ho una query che viene composta attraverso filtri e raggruppamenti ed alla fine estraggo un set di dati come questo
PHP:
[
{"Qta":"1","Cod_Art":"123","DDif":"Rotto"},
{"Qta":"2","Cod_Art":"123","DDif":"Spaccato"},
{"Qta":"3","Cod_Art":"123","DDif":"Deformato"},
{"Qta":"4","Cod_Art":"123","DDif":"Deformato"},

{"Qta":"1","Cod_Art":"456","DDif":"Rotto"},
{"Qta":"2","Cod_Art":"456","DDif":"Strappato"},
{"Qta":"3","Cod_Art":"456","DDif":"Deformato"},

]
lavorando su questa query che estrae il tutto tipo :
PHP:
query1= "select qr.Qta, qr.Cod_Art,qr.DDif from qr"
gradirei girare i dati a parità di Cod_Art distinti per DDif
e sommare i dati a parità di Cod_Art e di DDif
o meglio gradirei ottenere qualcosa di questo tipo:
PHP:
[
{"Cod_Art":"123","DDif_1":"Rotto","Qta_1":"1","DDif_2":"Spaccato","Qta_2":"2","DDif_3":"Deformato","Qta_3":"7","DDif_4":"Strappato","Qta_4":"0"},
{"Cod_Art":"456","DDif_1":"Rotto","Qta_1":"1","DDif_2":"Spaccato","Qta_2":"0","DDif_3":"Deformato","Qta_3":"3","DDif_4":"Strappato","Qta_4":"2"},
]
spero di essermi spiegato bene.......
ora non so se dico una fesseria ma esistono gli operatori PIVOT e UNPIVOT .......
potete aiutarmi per favore......grazie 1000 come sempre
ragazzi se mi potete aiutare, ho trovato questa piccola/mezza soluzione che non è certo quello che volevo ma una parte di essa....

PHP:
SELECT qr1.Cod_Art, GROUP_CONCAT(DISTINCT qr1.DDif) AS Difetto,GROUP_CONCAT(qr1.Qta) AS Qta
FROM (select qr.Qta, qr.Cod_Art,qr.DDif from qr)qr1 GROUP BY qr1.Cod_Art
cosi facendo pero poi mi trovo i record tutti dentro una unica colonna Difetto ed una unica colonna Qta....
Avete soluzioni diverse ??
 

marino51

Utente Attivo
28 Feb 2013
2.724
141
63
Lombardia
Avete soluzioni diverse ??
prova questa query,
SQL:
SELECT Cod_Art, [Rotto], [Spaccato], [Strappato], [Deformato]
FROM
(SELECT Cod_Art, DDif, Qta FROM qr) p
PIVOT
(
    SUM(Qta)
    FOR DDif IN ( [Rotto], [Spaccato], [Strappato], [Deformato] )
) AS pvt
ORDER BY pvt.Cod_Art;
con questo risultato

1582393243742.png


ricorda che usando un linguaggio di programmazione, puoi creare la query in modo dinamico
leggendo con "distinct" le causali "[Rotto], [Spaccato], [Strappato], [Deformato]",
componendo la stringa
e componendo la query
 

max1974

Utente Attivo
7 Mar 2013
106
0
16
prova questa query,
SQL:
SELECT Cod_Art, [Rotto], [Spaccato], [Strappato], [Deformato]
FROM
(SE
[QUOTE="marino51, post: 213880, member: 23861"]
prova questa query,
[CODE=sql]SELECT Cod_Art, [Rotto], [Spaccato], [Strappato], [Deformato]
FROM
(SELECT Cod_Art, DDif, Qta FROM qr) p
PIVOT
(
    SUM(Qta)
    FOR DDif IN ( [Rotto], [Spaccato], [Strappato], [Deformato] )
) AS pvt
ORDER BY pvt.Cod_Art;
con questo risultato

Vedi l'allegato 6971

ricorda che usando un linguaggio di programmazione, puoi creare la query in modo dinamico
leggendo con "distinct" le causali "[Rotto], [Spaccato], [Strappato], [Deformato]",
componendo la stringa
e componendo la query
;[/CODE]

con questo risultato

Vedi l'allegato 6971

ricorda che usando un linguaggio di programmazione, puoi creare la query in modo dinamico
leggendo con "distinct" le causali "[Rotto], [Spaccato], [Strappato], [Deformato]",
componendo la stringa
e componendo la query
[/QUOTE]
Scusa non ho specificato..... mi serve per MYSQL
mi serve si creare i difetti in modo dinamico in quanto non so quanti possano esistere dovrei usare questa query se non erro
PHP:
SELECT DISTINCT qr1.DDif FROM(
SELECT Cod_Art, DDif, Qta FROM qr)qr1
 
Ultima modifica:

marino51

Utente Attivo
28 Feb 2013
2.724
141
63
Lombardia
Scusa non ho specificato..... mi serve per MYSQL
la query che ti ho indicato dovrebbe essere in sintonia anche con mySQL, (senza modifiche) l'hai provata ?

per estrarre le cause e costruire la stringa, puoi usare più semplicemente
SQL:
SELECT distinct DDif from qr order by DDif
1582448315998.png
 

max1974

Utente Attivo
7 Mar 2013
106
0
16
la query che ti ho indicato dovrebbe essere in sintonia anche con mySQL, (senza modifiche) l'hai provata ?

per estrarre le cause e costruire la stringa, puoi usare più semplicemente
SQL:
SELECT distinct DDif from qr order by DDif
Vedi l'allegato 6972
Si Marino l'ho provata ma segnala diversi Errori...
ti elenco solo i principali:
  1. Un alias è stato trovato precedentemente. (near "PIVOT" at position 3253)
  2. Token inatteso. (near "PIVOT" at position 3253)
  3. Token inatteso. (near "(" at position 3260)
  4. Parola chiave non riconosciuta. (near "SUM" at position 3267)
  5. Token inatteso. (near "(" at position 3270)
  6. Token inatteso. (near "Qta" at position 3271)
  7. Token inatteso. (near ")" at position 3274)
  8. Parola chiave non riconosciuta. (near "FOR" at position 3281)
  9. Token inatteso. (near "DDif" at position 3285)
 

marino51

Utente Attivo
28 Feb 2013
2.724
141
63
Lombardia
prova a sostituire le parentesi quadre con il carattere `

fai riferimento all'esempio in questo link
 
Ultima modifica:

max1974

Utente Attivo
7 Mar 2013
106
0
16
prova a sostituire le parentesi quadre con il carattere `
ho provato credo proprio che il problema sia su quella lettera p, se la rimuovo mi segnala solo 3 errori
  1. Un alias è stato trovato precedentemente. (near "pvt" at position 3375)
  2. Era atteso un alias. (near " " at position 3374)
  3. Token inatteso. (near "pvt" at position 3375)
 

marino51

Utente Attivo
28 Feb 2013
2.724
141
63
Lombardia
ok, codice più tradizionale e meno specifico
SQL:
SELECT
  Cod_Art
, MAX(CASE WHEN DDif = 'Rotto'     THEN Qta END) 'Rotto'
, MAX(CASE WHEN DDif = 'Spaccato'  THEN Qta END) 'Spaccato'
, MAX(CASE WHEN DDif = 'Strappato' THEN Qta END) 'Strappato'
, MAX(CASE WHEN DDif = 'Deformato' THEN Qta END) 'Deformato'
FROM
  ( SELECT Cod_Art, DDif, sum(Qta) as Qta FROM qr GROUP BY Cod_Art, DDif ) t
GROUP BY Cod_Art
ORDER BY Cod_Art
1582462189379.png



puoi crearlo dinamicamente aggiungendo righe "MAX(CASE ….." per quante sono le cause esistenti, ottenendole dalla query
SQL:
SELECT distinct DDif from qr order by DDif
ps, non perdere per strada la "t" isolata in fondo alla select, NON é un errore
 
Ultima modifica:

max1974

Utente Attivo
7 Mar 2013
106
0
16
ok, codice più tradizionale e meno specifico
SQL:
SELECT
  Cod_Art
, MAX(CASE WHEN DDif = 'Rotto'     THEN Qta END) 'Rotto'
, MAX(CASE WHEN DDif = 'Spaccato'  THEN Qta END) 'Spaccato'
, MAX(CASE WHEN DDif = 'Strappato' THEN Qta END) 'Strappato'
, MAX(CASE WHEN DDif = 'Deformato' THEN Qta END) 'Deformato'
FROM
  ( SELECT Cod_Art, DDif, sum(Qta) as Qta FROM qr GROUP BY Cod_Art, DDif ) t
GROUP BY Cod_Art
ORDER BY Cod_Art
Vedi l'allegato 6974


puoi crearlo dinamicamente aggiungendo righe "MAX(CASE ….." per quante sono le cause esistenti, ottenendole dalla query
SQL:
SELECT distinct DDif from qr order by DDif
ps, non perdere per strada la "t" isolata in fondo alla select, NON é un errore
MARINO SEI UN GRANDE ......
SE non fosse per il CORONAVIRUS e per il SESSO ti darei un bacio......

Mi ci è voluto un po per eleborarla ma alla fine sembra "ok" devo solo verificare i risultati se sono giusti ma credo di si...
Ne approfitto per chiederti ultima info......quei valori null posso sostituirli con lo '0' (zero) ???
 

Allegati