[英]SQL query to pivot descriptive fields
此解決方案僅適用於每個國家/地區的行數static 。 首先使用ROW_NUMBER()和 PARTITION BY 來檢索國家/地區的序列化城市。 然后將其用作子查詢並使用MAX()與外部子查詢的 case 條件來檢索最終結果。
-- SQL SERVER (v2017)
SELECT t.country
, MAX(CASE WHEN t.row_num = 1 THEN city END) city1
, MAX(CASE WHEN t.row_num = 2 THEN city END) city2
, MAX(CASE WHEN t.row_num = 3 THEN city END) city3
FROM (SELECT *
, ROW_NUMBER() OVER (PARTITION BY country ORDER BY country) row_num
FROM test) t
GROUP BY t.country
請使用此 url https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=8812f794d4c9ea64bf99e9640800da77
可能的方法是條件聚合和PIVOT
。 如果每個國家/地區的城市數量不同,則需要對行進行編號並適當地分組:
桌子:
SELECT *
INTO Data
FROM (VALUES
('US', 'Dallas'),
('US', 'Atlanta'),
('US', 'Los Angeles'),
('US', 'Chicago'),
('UK', 'London'),
('UK', 'Manchester'),
('UK', 'Birmingham')
) v (COUNTRY, CITY)
帶有條件聚合的語句:
SELECT
COUNTRY,
City1 = MAX(CASE WHEN RN % 3 = 0 THEN CITY END),
City2 = MAX(CASE WHEN RN % 3 = 1 THEN CITY END),
City3 = MAX(CASE WHEN RN % 3 = 2 THEN CITY END)
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY COUNTRY ORDER BY CITY) - 1 AS RN
FROM Data
) t
GROUP BY COUNTRY, RN / 3
PIVOT 的聲明:
SELECT COUNTRY, CITY1, CITY2, CITY3
FROM (
SELECT
(ROW_NUMBER() OVER (PARTITION BY COUNTRY ORDER BY CITY) - 1) / 3 AS ID,
*,
CASE (ROW_NUMBER() OVER (PARTITION BY COUNTRY ORDER BY CITY) - 1) % 3
WHEN 0 THEN 'CITY1'
WHEN 1 THEN 'CITY2'
WHEN 2 THEN 'CITY3'
END AS CITYNAME
FROM Data
) t
PIVOT (
MAX(CITY)
FOR CITYNAME IN ([CITY1], [CITY2], [CITY3])
) p
結果:
COUNTRY CITY1 CITY2 CITY3
-------------------------------------
UK Birmingham London Manchester
US Atlanta Chicago Dallas
US Los Angeles
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.