Valori Separati da virgola con Query SQL

My SQL tabella come la seguente

City_Code     Post_Code    Post_Code_Description
100           A1           ABC
100           C8           XYZ
100           Z3           MNO
200           D4           LMN
300           E3           IJK
300           B9           RST

È un mapping tra city_code e Post_Code. Uno City_Code ha molti Codici postali. Ora vorrei eseguire una Query per ottenere qualcosa di simile seguenti

City_Code     Post_Code    Post_Code_Description
100           A1,C8,Z3     ABC,XYZ,MNO
200           D4           LMN
300           E3,B9        IJK,RST

Potete per favore aiutarmi con thisy tabella SQL è come seguire

  • Prima frase “la Mia tabella di SQL è come seguire”, ma lo spazio tra “Mio” e “SQL” hmm… Ora non sono sicuro, ho rimosso il tag 🙂
  • immagino che la risposta è esattamente la stessa come la tua precedente domanda valori separati da Virgola con query SQL

 

4 Replies
  1. 24

    provare questo:

    SELECT City_Code, 
          Post_Code = 
            STUFF((SELECT ', ' + Post_Code
               FROM your_table b 
               WHERE b.City_Code = a.City_Code 
              FOR XML PATH('')), 1, 2, ''),
          Post_Code_Description=
            STUFF((SELECT ', ' + Post_Code_Description
               FROM your_table b 
               WHERE b.City_Code = a.City_Code 
              FOR XML PATH('')), 1, 2, '')
    FROM your_table a
    GROUP BY City_Code
    • Credo che dovrebbe essere roba(…, 1, 1, “) else perdere un personaggio.
    • No. SELEZIONA prefissi con 2 personaggi <virgola> e <spazio> quindi la ROBA deve rimuovere 2 caratteri dalla posizione 1. Avreste ragione se è stato solo l’aggiunta di una virgola.
  2. 9

    Se si utilizza MySQL, è possibile utilizzare GROUP_CONCAT()

    select City_Code, 
         GROUP_CONCAT(Post_Code) Post_Code, 
         GROUP_CONCAT(Post_Code_Description) post_code_description
    from yourtable
    group by City_Code

    Per SQL Server è possibile utilizzare ROBA() e PER XML PATH()

    select city_code,
        Stuff((SELECT ', ' + post_code 
                FROM yourtable t2
                where t1.city_code = t2.city_code
                FOR XML path('')),1,1,'') Post_Code,
        Stuff((SELECT ', ' + post_code_description
                FROM yourtable t2
                where t1.city_code = t2.city_code
                FOR XML path('')),1,1,'') post_code_description
    from yourtable t1
    group by city_code
    • Sto usando SQL Server 2008 R2
    • si prega di vedere la mia modifica, ho aggiunto una risposta per SQL Server
    • Po ‘ strano dire che per SQL Server è possibile utilizzare STUFF. È XML PATH che fa tutto il lavoro. STUFF appena si intrufola alla fine e rimuove l’avanzo di una virgola.
    • si sono corretti, aggiornati per includere link a FOR XML PATH()
    • bella risposta 🙂 btw, qualche motivo per cui sono stati rimossi tutti i tag nelle domande MySQL-Pivot? niente di sbagliato con la creazione di nuovi tag?
    • niente di sbagliato con la creazione di un nuovo tag, ma sembra ridondante considerando che la maggior parte delle domande sono contrassegnati con la MySQL e PIVOT, non credo che c’è bisogno di MySQL-PIVOT. La maggior parte PIVOT domanda, anche MySQL quelli che possono rientrare nella normale PIVOT tag, io credo che l’aggiunta di uno sarà solo essere fonte di confusione.

  3. 4

    provare questo:

    select city_code,substring((select ',' + post_code  
    from city b where a.city_code=b.city_code
    for xml path('')
    ),2,100)as post_code,
    substring((select ',' + post_code_description 
    from city c where a.city_code=c.city_code
    for xml path('')
    ),2,100)as post_code_description
    from city a
    group by a.city_code
  4. 1

    Utilizzare una query ricorsiva per questo:

    --Prepare Dummy Data
    ;WITH CITIES 
         AS (SELECT 100   AS City_Code, 
                    'A1'  AS Post_code, 
                    'ABC' AS Post_Code_Description 
             UNION 
             SELECT 100   AS City_Code, 
                    'C8'  AS Post_code, 
                    'XYZ' AS Post_Code_Description 
             UNION 
             SELECT 100   AS City_Code, 
                    'Z3'  AS Post_code, 
                    'MNO' AS Post_Code_Description 
             UNION 
             SELECT 200   AS City_Code, 
                    'D4'  AS Post_code, 
                    'LMN' AS Post_Code_Description 
             UNION 
             SELECT 300   AS City_Code, 
                    'E3'  AS Post_code, 
                    'IJK' AS Post_Code_Description 
             UNION 
             SELECT 300   AS City_Code, 
                    'B9'  AS Post_code, 
                    'RST' AS Post_Code_Description), 
    --Add Row numbers to each row
         PREPARE 
         AS (SELECT *, 
                    ROW_NUMBER () 
                      OVER ( 
                        PARTITION BY CITY_CODE 
                        ORDER BY CITY_CODE) RN 
             FROM   CITIES),
    --Start Recursive CTE 
         RECURSIVE 
         AS (
    --Anchor Query
             SELECT CITY_CODE, 
                    CAST(POST_CODE AS VARCHAR(MAX))             Post_code, 
                    CAST(POST_CODE_DESCRIPTION AS VARCHAR(MAX)) 
                    Post_Code_Description, 
                    1                                           AS LEVEL, 
                    RN 
             FROM   PREPARE 
             WHERE  RN = 1 
             UNION ALL 
    --Recursive Query
             SELECT T1.CITY_CODE, 
                    T1.POST_CODE + ',' + T2.POST_CODE, 
                    T1.POST_CODE_DESCRIPTION + ',' 
                    + T2.POST_CODE_DESCRIPTION, 
                    T2.LEVEL + 1, 
                    T1.RN 
             FROM   PREPARE AS T1 
                    INNER JOIN RECURSIVE AS T2 
                            ON T1.RN = T2.RN + 1 
                               AND T1.CITY_CODE = T2.CITY_CODE) 
    --Final Results
    SELECT T1.CITY_CODE, 
           T1.POST_CODE, 
           T1.POST_CODE_DESCRIPTION 
    FROM   RECURSIVE T1 
           INNER JOIN (SELECT CITY_CODE, 
                              COUNT(*) cnt 
                       FROM   CITIES 
                       GROUP  BY CITY_CODE)T2 
                   ON T1.CITY_CODE = T2.CITY_CODE 
    WHERE  T1.LEVEL = T2.CNT 

Lascia un commento