Je suis en train de «traduire» les requêtes Power BI en requêtes SQL. L'une des requêtes clés effectue les opérations suivantes:

  1. Prend le tableau suivant:
+-----+-----+----------+
| PID | FID | Quantity |
+-----+-----+----------+
| 1   | A   | 15       |
+-----+-----+----------+
| 1   | B   | 2        |
+-----+-----+----------+
| 2   | B   | 3        |
+-----+-----+----------+
| 2   | D   | 8        |
+-----+-----+----------+
| 3   | C   | 2        |
+-----+-----+----------+
  1. Regrouper par PID, en conservant toutes les lignes (chaque Data est une table):
+-----+-------+
| PID | Table |
+-----+-------+
| 1   | Data  |
+-----+-------+
| 2   | Data  |
+-----+-------+
| 3   | Data  |
+-----+-------+
  1. Exécute une logique / manipulation personnalisée (dont certaines sont très compliquées, donc pas seulement COUNT ou MAX, etc.) par Data, et transforme chaque Data en un nouveau tableau par ligne:
+-----+-------+-------------+
| PID | Table | Transformed |
+-----+-------+-------------+
| 1   | Data  | Data        |
+-----+-------+-------------+
| 2   | Data  | Data        |
+-----+-------+-------------+
| 3   | Data  | Data        |
+-----+-------+-------------+
  1. Développez la colonne Transformed:
+-----+----------------+----------------+
| PID | ResultColumn-1 | ResultColumn-2 |
+-----+----------------+----------------+
| 1   | SomeResult-1   | SomeResult-1b  |
+-----+----------------+----------------+
| 2   | SomeResult-2   | SomeResult-2b  |
+-----+----------------+----------------+
| 3   | SomeResult-3   | SomeResult-3b  |
+-----+----------------+----------------+

Cette procédure est-elle possible en SQL? Je pensais que nous pourrions utiliser Group By avec une fonction personnalisée, mais je ne savais pas trop comment procéder - toute indication serait grandement appréciée.

Merci!


Exemple de sortie:

+-----+------------------+----------------+
| PID | ResultColumn-1   | ResultColumn-2 |
+-----+------------------+----------------+
| 1   | There are 2 of B | and 15 of A    |
+-----+------------------+----------------+
| 2   | There are 8 of D | and 3 of B     |
+-----+------------------+----------------+
| 3   | There are 2 of C |                |
+-----+------------------+----------------+
2
Schteeb 16 août 2020 à 04:56

2 réponses

Meilleure réponse

Vous pouvez le faire avec row_number() et l'agrégation conditionnelle:

select 
    pid,
    max(case when rn = 1 then concat('There are ', quantity, ' of ', fid) end) res1,
    max(case when rn = 2 then concat('And ', quantity, ' of ', fid) end) res2
from (
    select 
        t.*,
        row_number() over(partition by pid order by fid desc) rn
    from mytable t
) t
group by pid

Notez que cela ne suppose pas plus de 2 lignes par pid, comme indiqué dans vos données. Sinon, vous devrez probablement développer la clause select avec plus d'expressions conditionnelles.

2
GMB 16 août 2020 à 07:31

Oui, il est possible d'utiliser JOIN pour les rejoindre, puis vous pouvez regrouper vos résultats ou effectuer un traitement supplémentaire sur eux.

Votre requête initiale serait quelque chose comme:

SELECT 
    PID 
,   Table 
,   Transformed 
,   ResultColumn-1
,   ResultColumn-2
FROM 
    table1 t1
LEFT JOIN table2 t2 ON t2.PID = t1.PID 
LEFT JOIN table3 t3 ON t3.PID = t1.PID 
LEFT JOIN table4 t4 ON t4.PID = t1.PID 

C'est si PID est une clé primaire qui est utilisée comme clé étrangère dans les autres tables.

Si vous avez fourni les résultats attendus, alors nous pouvons vous donner une requête initiale qui le produirait, que vous pouvez utiliser comme un kick-starter!

1
iSR5 16 août 2020 à 03:12