recherche

Maison  >  Questions et réponses  >  le corps du texte

Réécrivez le titre comme : Regroupement SQL de colonnes utilisant des valeurs inversées

Supposons que j'ai une table comme celle-ci :

+---+---+---+---+---+
|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 et G3 sont des types VARCHAR, G2 et G4 sont des types INT

Si je fais un simple GROUP BY sur G1..G4, j'obtiens :

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

Je veux savoir si il est possible de faire de l'agrégation sur des valeurs inversées G1, G2 <-> G3, G4. Le résultat que je souhaite est le suivant :

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

J'ai essayé d'obtenir les lignes inversées mais je ne parviens toujours pas à les regrouper en raison de doublons. Ma requête de test est :

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粉548512637P粉548512637464 Il y a quelques jours685

répondre à tous(1)je répondrai

  • P粉042455250

    P粉0424552502023-09-07 00:07:33

    Si j'ai bien compris, inversez l'ordre des colonnes pour que A B C D corresponde à 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<>violon

    répondre
    0
  • Annulerrépondre