2012-10-01 31 views
15
bảng

SQL của tôi là như sauComma Separated Values ​​với SQL Query

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 

Đó là một ánh xạ giữa city_code và Post_Code. Một City_Code có nhiều Mã bưu điện. Bây giờ tôi muốn chạy một truy vấn để có được một cái gì đó như sau

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

bạn có thể vui lòng giúp tôi với thisy bảng SQL được như sau

+0

câu đầu tiên "bảng SQL của tôi là như sau" nhưng khoảng cách giữa " Bây giờ tôi không chắc chắn, tôi đã xóa thẻ :) – Parado

+1

tôi hình dung câu trả lời chính xác giống như câu hỏi trước của bạn [Giá trị được phân cách bằng dấu phẩy bằng truy vấn SQL] (http: // stackoverflow .com/questions/12670409/comma-sepa Đánh giá-giá trị-với-sql-truy vấn) – podiluska

Trả lời

21

thử điều này:

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

Tôi tin rằng nó nên là công cụ (..., 1, 1, '') khác mất một nhân vật. – crokusek

9

Nếu bạn đang sử dụng MySQL bạn có thể sử dụng 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 

Đối với SQL server, bạn có thể sử dụng STUFF()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

Tôi đang sử dụng SQL Server 2008 R2 – InTheWorldOfCodingApplications

+0

@ user1711287 vui lòng xem chỉnh sửa của tôi, tôi đã thêm câu trả lời cho SQL Server – Taryn

+3

Bit lẻ để nói rằng đối với SQL Server bạn có thể sử dụng 'STUFF'. Đó là 'XML PATH' thực hiện tất cả công việc. 'STUFF' chỉ lẻn vào cuối và loại bỏ dấu phẩy dư thừa. –

4

thử điều này:

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

Sử dụng một truy vấn đệ quy cho việc này:

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