Visualizzazione dei risultati da 1 a 5 su 5

Hybrid View

  1. #1

    Riclassificazione di una tabella

    Ho una tabella cos'ì composta
    Key Val1 Val2
    AA 10 20
    BB 30 40
    CC .. ..
    e con un'unica select vorrei ottenere
    10 30
    20 40

    in pratica devo costruire una tabella mettendo le colonne Val1 e Val2 in verticale
    qualcuno ha qualche idea?

  2. #2
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    e se nella tabella avessi 1000 record allora il tuo risultato della SELECT dovrebbe avere 1000 colonne ??

    Facci sapere

    .

  3. #3
    Quote Originariamente inviata da nman Visualizza il messaggio
    e se nella tabella avessi 1000 record allora il tuo risultato della SELECT dovrebbe avere 1000 colonne ??

    Facci sapere

    .
    no, non intenzione di farmi "cos'ì male!
    le colonne sono sempre 2 mentre le righe possono variare da 2 a 10.

  4. #4
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Premesso che queste cose solitamente si fanno a lato applicazione .......

    tu vorresti fare con una unica SELECT quella roba li ....

    assomiglia un pochino a una PIVOT o Campi Incrociati ma se le righe (record)
    sono solamente 10 che poi diventeranno 10 colonne (campi) allora puoi fare cosi:
    anche se fossero 20 o 30 potresti

    Immagina di avere questa tabella di nome "Tab"
    - Key ----- Testo ----- Chiave primaria
    - Val1 ------ Numerico
    - Val2 ------ Numerico

    Per la comprensione cominciamo a fare più SELECT
    che alla fine andremo a nidificare in una unica

    Ho usato Access per la sintassi, poi dovrai adeguarla al tuo DB

    Facciamo una prima SELECT di nome "Q01" per numerare i record
    codice:
    SELECT 
    T1.Key, T1.Val1, T1.Val2, 
    "N" & Format((SELECT Count(T2.Key) FROM Tab AS T2 WHERE T1.Key>=T2.Key),"00") AS RecNum 
    FROM 
    Tab AS T1
    ;
    poi su "Q01" facciamo la "Q04" che ci mette il Val1 in orizzontale
    codice:
    SELECT 
    Max(IIf([RecNum]="N01",[Val1])) AS Xx01, 
    Max(IIf([RecNum]="N02",[Val1])) AS Xx02, 
    Max(IIf([RecNum]="N03",[Val1])) AS Xx03, 
    Max(IIf([RecNum]="N04",[Val1])) AS Xx04, 
    Max(IIf([RecNum]="N05",[Val1])) AS Xx05, 
    Max(IIf([RecNum]="N06",[Val1])) AS Xx06 
    FROM 
    Q01
    ;
    poi ancora su "Q01" facciamo la "Q05" che ci mette il Val2 in orizzontale
    codice:
    SELECT 
    Max(IIf([RecNum]="N01",[Val2])) AS Xx01, 
    Max(IIf([RecNum]="N02",[Val2])) AS Xx02, 
    Max(IIf([RecNum]="N03",[Val2])) AS Xx03, 
    Max(IIf([RecNum]="N04",[Val2])) AS Xx04, 
    Max(IIf([RecNum]="N05",[Val2])) AS Xx05, 
    Max(IIf([RecNum]="N06",[Val2])) AS Xx06 
    FROM 
    Q01
    ;
    poi su "Q04" e "Q05" facciamo la "Q08" che con UNION sovrappone le 2 righe
    codice:
    SELECT 
    Q04.Xx01, Q04.Xx02, Q04.Xx03, Q04.Xx04, Q04.Xx05, Q04.Xx06 
    FROM 
    Q04 
    UNION ALL 
    SELECT 
    Q05.Xx01, Q05.Xx02, Q05.Xx03, Q05.Xx04, Q05.Xx05, Q05.Xx06 
    FROM 
    Q05
    ;




    Che messo in una unica SELECT multinidificata viene cosi
    codice:
    SELECT 
    Q04.Xx01, Q04.Xx02, Q04.Xx03, Q04.Xx04, Q04.Xx05, Q04.Xx06 
    FROM 
      (
      SELECT 
      Max(IIf([RecNum]="N01",[Val1])) AS Xx01, 
      Max(IIf([RecNum]="N02",[Val1])) AS Xx02, 
      Max(IIf([RecNum]="N03",[Val1])) AS Xx03, 
      Max(IIf([RecNum]="N04",[Val1])) AS Xx04, 
      Max(IIf([RecNum]="N05",[Val1])) AS Xx05, 
      Max(IIf([RecNum]="N06",[Val1])) AS Xx06 
      FROM 
        (
        SELECT 
        T1.Key, T1.Val1, T1.Val2, 
        "N" & Format((SELECT Count(T2.Key) FROM Tab AS T2 WHERE T1.Key>=T2.Key),"00") AS RecNum 
        FROM 
        Tab AS T1
        ) AS Q01
      ) AS Q04 
    UNION ALL 
    SELECT 
    Q05.Xx01, Q05.Xx02, Q05.Xx03, Q05.Xx04, Q05.Xx05, Q05.Xx06 
    FROM 
      (
      SELECT 
      Max(IIf([RecNum]="N01",[Val2])) AS Xx01, 
      Max(IIf([RecNum]="N02",[Val2])) AS Xx02, 
      Max(IIf([RecNum]="N03",[Val2])) AS Xx03, 
      Max(IIf([RecNum]="N04",[Val2])) AS Xx04, 
      Max(IIf([RecNum]="N05",[Val2])) AS Xx05, 
      Max(IIf([RecNum]="N06",[Val2])) AS Xx06
      FROM 
        (
        SELECT 
        T1.Key, T1.Val1, T1.Val2, 
        "N" & Format((SELECT Count(T2.Key) FROM Tab AS T2 WHERE T1.Key>=T2.Key),"00") AS RecNum 
        FROM Tab AS T1
        ) AS Q01
      ) AS Q05
    ;
    Facci sapere
    .
    Ultima modifica di nman; 07-02-2015 a 01:05

  5. #5
    che database stai usando?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.