簡體   English   中英

SQL 查詢 pivot 描述性字段

[英]SQL query to pivot descriptive fields

我有以下輸入和預期的 output 表。 我嘗試使用自我連接,但沒有奏效。 有沒有辦法使用PIVOT function 來做到這一點?

在此處輸入圖像描述

預期 output

在此處輸入圖像描述

提前致謝

此解決方案僅適用於每個國家/地區的行數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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM