Schreiben Sie den Titel wie folgt um: SQL-Gruppierung von Spalten mit umgekehrten Werten
P粉548512637
P粉548512637 2023-09-06 11:53:34
0
1
691

Angenommen, ich hätte einen Tisch wie diesen:

+---+---+---+---+---+
|G1 |G2 |G3 |G4 | V |
+---+---+---+---+---+
| A | B | C | D | 2 |
| E | F | G | H | 4 |
| C | D | A | B | 2 |
| E | F | G | H | 3 |
| E | I | G | L | 7 |
+---+---+---+---+---+

G1 und G3 sind VARCHAR-Typen, G2 und G4 sind INT-Typen

Wenn ich ein einfaches GROUP BY auf G1..G4 durchführe, erhalte ich:

SELECT G1,G2,G3,G4,SUM(V) as V FROM Table GROUP BY G1, G2, G3, G4;

    +---+---+---+---+---+
    |G1 |G2 |G3 |G4 | V |
    +---+---+---+---+---+
    | A | B | C | D | 2 |
    | E | F | G | H | 7 |
    | C | D | A | B | 2 |
    | E | I | G | L | 7 |
    +---+---+---+---+---+

Ich möchte wissen, ob es möglich ist, eine Aggregation für die invertierten Werte G1, G2 <-> G3, G4 durchzuführen. Das Ergebnis, das ich möchte, ist dieses:

+---+---+---+---+---+      +---+---+---+---+---+
|G1 |G2 |G3 |G4 | V |      |G1 |G2 |G3 |G4 | V |
+---+---+---+---+---+      +---+---+---+---+---+
| A | B | C | D | 4 |  或  | C | D | A | B | 4 |
| E | F | G | H | 7 |      | E | F | G | H | 7 |
| E | I | G | L | 7 |      | E | I | G | L | 7 |
+---+---+---+---+---+      +---+---+---+---+---+

Ich habe versucht, die umgekehrten Zeilen abzurufen, kann sie aber aufgrund von Duplikaten immer noch nicht zusammenfassen. Meine Testabfrage lautet:

SELECT DISTINCT *
FROM Table t1
JOIN Table t2 on t1.G1 = t2.G3 and t1.G2=t2.G4 and t1.G3=t2.G1 and t1.G4=t2.G2

    +---+---+---+---+---+---+---+---+---+---+
    |G1 |G2 |G3 |G4 | V |G1 |G2 |G3 |G4 | V |
    +---+---+---+---+---+---+---+---+---+---+
    | A | B | C | D | 2 | C | D | A | B | 2 |
    | C | D | A | B | 2 | A | B | C | D | 2 |
    +---+---+---+---+---+---+---+---+---+---+

P粉548512637
P粉548512637

Antworte allen(1)
P粉042455250

如果我理解正确,将列的顺序反转,使得 A B C D 对应 C D A B。

select 
         case when(g1 > g3) then g3 else g1 end G1,
         case when(g1 > g3) then g4 else g2 end G2,
         case when(g1 > g3) then g1 else g3 end G3,
         case when(g1 > g3) then g2 else g4 end G4, sum(V)
from tbl
group by case when(g1 > g3) then g3 else g1 end,
         case when(g1 > g3) then g4 else g2 end,
         case when(g1 > g3) then g1 else g3 end,
         case when(g1 > g3) then g2 else g4 end

db<>fiddle

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage