2017-07-14 1 views
0

J'ai été invité à créer un rapport qui affiche les données de transaction pour les membres individuels et montre à quelle fréquence ils ont effectué le même type de transaction.Tableau croisé dynamique MySql basé sur le nombre de transactions

Par exemple:

Bob de l'organisation X a acheté 5 bananes à la fois sur 10 différentes occasions/transactions et Bob de cette même organisation a acheté 3 bananes à la fois sur 20 différentes occasions/transactions .

La base de données contient des données de transaction sous cette forme

|TransactionID | Organization | MemberNumber | ItemID| QuantityPurchased 

J'ai actuellement une requête qui crée une table temporaire dans le format suivant.

|Organization | MemberNumber | ItemID | QuantityItemsPurchased | QuantityOfTransactions 
---------------------------------------------------------------------------------------- 
|Company X | 2044   | B2  | 5      | 10 
|Company X | 2044   | B2  | 3      | 20 
|Company Y | 2035   | A3  | 5      | 5 

On m'a demandé de créer un rapport dans le format suivant (le format du rapport est pas pour moi de débat), où chaque colonne de nombre est des transactions avec cette quantité d'articles vendus et la valeur chaque ligne correspond au nombre de transactions ayant vendu cette quantité d'éléments.

|Organization | MemberNumber | ItemID |1 |2 |3 |4 |5 |6+ | 
----------------------------------------------------------------- 
|Company X | 2044   | B2  |0 |0 |20 |0 |10 |0 | 
|Company Y | 2035   | A3  |0 |0 |0 |0 |5 |0 | 

Je ne sais pas comment écrire une requête qui peut trier quantityOfItemsPurchased en colonnes individuelles et afficher les QuantityOfTransactions valeur.

J'ai essayé d'écrire une requête similaire à ci-dessous, mais cela ne fonctionne pas pour moi car il donne une valeur de 1 ou 0 sous toutes les colonnes numériques au lieu de la valeur QuantityOfTransactions.

Select Organization, MemberNumber, ItemId, 
count(Case when tempTable.quantityOfItemsPurchased = 1 then tempTable.QuantityOfTransactions end) as '1', 
count(Case when tempTable.quantityOfItemsPurchased = 2 then tempTable.QuantityOfTransactions end) as '2', 
count(Case when tempTable.quantityOfItemsPurchased = 3 then tempTable.QuantityOfTransactions end) as '3', 
count(Case when tempTable.quantityOfItemsPurchased = 4 then tempTable.QuantityOfTransactions end) as '4', 
count(Case when tempTable.quantityOfItemsPurchased = 5 then tempTable.QuantityOfTransactions end) as '5', 
count(Case when tempTable.quantityOfItemsPurchased >= 6 then tempTable.QuantityOfTransactions end) as '6+' 
from TempTable group by Organization, MemberNumber, ItemId 
+0

Ce genre de chose est si facile dans le code d'application. :-( – Strawberry

+0

Strawberry, d'accord que ce serait plus facile, mais nous essayons de garder ces types de rapports distincts de l'application que les ventes/gestion demande toujours des modifications aux rapports et il n'est pas pratique d'avoir à publier constamment une nouvelle construction Malheureusement, ma connaissance de DB est limitée, mais c'est ce qu'elle est – Jcross

Répondre

1

Vous avez besoin quelque chose comme ceci:

SELECT Organization, MemberNumber, ItemID, 
     SUM(CASE WHEN QuantityItemsPurchased = 1 
      THEN QuantityOfTransactions ELSE 0 END) As `1`, 
     SUM(CASE WHEN QuantityItemsPurchased = 2 
      THEN QuantityOfTransactions ELSE 0 END) As `2`, 
     SUM(CASE WHEN QuantityItemsPurchased = 3 
      THEN QuantityOfTransactions ELSE 0 END) As `3`, 
     SUM(CASE WHEN QuantityItemsPurchased = 4 
      THEN QuantityOfTransactions ELSE 0 END) As `4`, 
     SUM(CASE WHEN QuantityItemsPurchased = 5 
      THEN QuantityOfTransactions ELSE 0 END) As `5`, 
     SUM(CASE WHEN QuantityItemsPurchased >= 6 
      THEN QuantityOfTransactions ELSE 0 END) As `6+` 
FROM Table1 
GROUP BY Organization, MemberNumber, ItemID 

Démo: SQL Fiddle

+0

krokodilko, Cela semble proche mais c'est le contraire de ce que j'essaie de faire.Veuillez voir le dernier tableau de ma question pour voir ce que le Les résultats finaux devraient ressembler Votre réponse est la commutation de la quantityItemsPurchased et la quantité de transactions.J'essaie de travailler avec l'exemple que vous avez fourni pour voir si je peux trouver quelque chose qui fonctionne. – Jcross

+0

krokodilko, en changeant les noms de colonnes dans la requête semblait faire l'affaire, voir http: // sqlfidd le.com/#!9/da1427/18 – Jcross