2012-10-01 24 views
15
mesa

My SQL es como seguirvalores separados por comas con consultas SQL

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 

Es un mapeo entre city_code y Post_Code. One City_Code tiene muchos códigos postales. Ahora quiero ejecutar una consulta para obtener algo como siguiente

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

¿Me podría ayudar con thisy tabla de SQL es como seguir

+0

Primera frase "Mi tabla de SQL es como seguir", pero el espacio entre " Mi "y" SQL "hmm ... Ahora no estoy seguro, eliminé la etiqueta :) – Parado

+1

me imagino que la respuesta es exactamente la misma que tu pregunta anterior [Valores separados por comas con consulta SQL] (http: // stackoverflow .com/questions/12670409/comma-sepa rated-values-with-sql-query) – podiluska

Respuesta

21

probar esto:

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 
+1

Creo que debería ser algo (..., 1, 1, '') más perder un personaje. – crokusek

9

Si está utilizando MySQL puede utilizar 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 

Para SQL Server, puede utilizar STUFF() y FOR 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 
+0

Estoy usando SQL Server 2008 R2 – InTheWorldOfCodingApplications

+0

@ user1711287 por favor vea mi edición, agregué una respuesta para SQL Server – Taryn

+3

Es extraño decir que para SQL Server puede usar 'STUFF'. Es 'XML PATH' que hace todo el trabajo. 'STUFF' solo se cuela al final y elimina la coma sobrante. –

4

intente esto:

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 
1

Usar una consulta recursiva para esto:

--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 
Cuestiones relacionadas