Ich habe eine Tabelle mit zwei Spalten (Name und Geschlecht). In meiner Tabelle befinden sich 4 Datensätze.

Name  Gender
A       Male
B       Female
C       Male
D       Female

Ich möchte eine SQL-Abfrage schreiben, um die obigen Daten in das folgende Format zu konvertieren.

Male      Female
A           B    
C           D
1
kabdul 18 Jän. 2019 im 11:35

3 Antworten

Beste Antwort

Hier ist eine Option, bei der CTEs verwendet werden:

WITH male AS (
    SELECT Name, ROW_NUMBER() OVER (ORDER BY Name) rn
    FROM yourTable
    WHERE Gender = 'Male'
),
female AS (
    SELECT Name, ROW_NUMBER() OVER (ORDER BY Name) rn
    FROM yourTable
    WHERE Gender = 'Female'
)

SELECT m.Name AS Male, f.Name AS Female
FROM male m
INNER JOIN female f
    ON m.rn = f.rn;

Demo

0
Tim Biegeleisen 18 Jän. 2019 im 09:05

Eine andere Möglichkeit ähnlich der von Tim, erfordert jedoch nur einen einzigen CTE:

with numbered as (
   select name, gender, row_number() over (partition by gender order by name) as rn
   from the_table
)
select f.name as "Female", m.name as "Male"
from numbered f 
  full outer join numbered m on m.rn = f.rn and m.gender = 'Male'
where f.gender = 'Female';

Bei Verwendung eines vollständigen äußeren Joins funktioniert dies auch, wenn pro Geschlecht eine andere Anzahl von Zeilen vorhanden ist.

Online-Beispiel

2
a_horse_with_no_name 18 Jän. 2019 im 09:09

So einfach kann das sein:

SELECT m.Name Male, f.Name Female
FROM t m, t f
WHERE m.Gender = "Male" AND f.Gender = "Female";

Aber es macht nicht viel Sinn, ich hoffe du weißt was du tust.

0
pid 18 Jän. 2019 im 08:41