2017-10-18 3 views
-2

Je voudrais créer quelque chose comme çaÉcrire un sql pour faire pivoter une table

Tableau de données d'entrée

customer_id fee_name amount 
1 a 1 
1 b 3.25 
1 c 1.75 
1 d 2 
1 e 0 
2 a 1 
2 b 3.25 
2 c 1.75 
2 d 2 
2 e 0 
3 a 1 
3 b 3.25 
3 c 1.75 
3 d 3.5 
3 e 0 
4 a 1 
4 b 3.25 
4 c 1.75 
4 d 3.5 
4 f 1 
5 a 1 
5 b 3.25 
5 c 1.75 
5 d 3.5 
5 f 1 

Voir, vous devez créer des groupes pour tous fee_name et le montant. Donc, il y aurait 3 groupes ici. 1 ressemblant au calendrier pour le client 1 et 2, deuxième groupe ressemblant clients 3 et le troisième groupe ressemblant calendrier pour les clients 4 et 5. Nommez ce groupe aussi

Sortie 1 devrait ressembler à

group a b  c  d e f 
    1 1 3.25 1.75 2 0 0 
    2 1 3.25 1.75 3.5 0 0 
    3 1 3.25 1.75 3.5 0 1 

Deuxième table de sortie devrait mapper ces groupes à l'identification du client. Donc deuxième sortie devrait ressembler à

customer id group 
1 1 
2 1 
3 2 
4 3 
5 3 

Toute aide est très appréciée. Merci

+0

figure d'abord sur lequel vous utilisez SGBDR – Strawberry

+0

correctement. S'il vous plaît marquer C'est MySQL ou SQL Server, ne peut pas être les deux. Aussi, où est votre tentative de requête? – Eric

+0

J'utilise mysql – stormtrooper12

Répondre

0
SELECT x.* 
    , y.customer_id 
    , CASE WHEN @prev = x.fee_schedule THEN @i:[email protected] ELSE @i:[email protected]+1 END i 
    , @prev:=x.fee_schedule 
    FROM 
    (SELECT DISTINCT GROUP_CONCAT(amount ORDER BY fee_name) fee_schedule FROM my_table GROUP BY customer_id) x 
    JOIN 
    (SELECT customer_id, GROUP_CONCAT(amount ORDER BY fee_name) fee_schedule FROM my_table GROUP BY customer_id) y 
    ON y.fee_schedule = x.fee_schedule 
    JOIN 
    (SELECT @prev:=null, @i:=0) vars 
ORDER 
    BY y.fee_schedule 
    , y.customer_id;