2012-08-30 4 views
1

J'ai deux tables Customers et CustomerStatusEntries:Groupe Sql Par deux champs

CustomerStatusEntries 
--------------------------- 
Id | Branch | CustomerStatus_Value | Customer_Id 

CustomerStatus_Value = ("B" = "Block" , "E" = "Created" etc...) 

Je dois obtenir cette sortie

enter image description here

+3

SGBDR Wich? S'il vous plaît poster à la fois les structures de table et des exemples de données, il sera utile d'obtenir des réponses et pas beaucoup de -1 – Yaroslav

+1

Vous devez 'PIVOT'. Si vous révélez quel type de SQL vous utilisez, quelqu'un pourrait vous dire comment. Ou vous pouvez rechercher. – podiluska

+0

suis en utilisant SQL Server j'ai déclaré les champs dont les utilisateurs ont besoin pour m'aider ... je pense que l'on peut facilement conclure que la table client a un ID qui est la clé primaire ... – rtp

Répondre

3
SELECT Branch AS 'Branch Code', 
    SUM(CASE WHEN CustomerStatus_Value = 'E' THEN 1 ELSE 0 END) AS 'Created', 
    SUM(CASE WHEN CustomerStatus_Value = 'A' THEN 1 ELSE 0 END) AS 'Active', 
    SUM(CASE WHEN CustomerStatus_Value = 'B' THEN 1 ELSE 0 END) AS 'Blocked', 
    SUM(CASE WHEN CustomerStatus_Value = 'C' THEN 1 ELSE 0 END) AS 'Cancelled', 
    COUNT(CustomerStatus_Value) AS 'All' 
FROM CustomerStatusEntries 
GROUP BY Id 
+0

les mettre dans le bon ordre :) –

+0

+1 mais il manque toujours la ligne 'Total', il semble également que' Id' ne soit pas présent et que l'alias 'Branch' soit' 'Branch Code''. –

+0

le Tout fonctionne! – rtp

1

En supposant que le nombre fixe de colonnes que vous avez montré dans votre échantillon, vous pourriez faire ceci:

SELECT Branch, 
     SUM(CASE WHEN CustomerStatus_Value = 'E' THEN 1 ELSE 0 END) AS Created, 
     SUM(CASE WHEN CustomerStatus_Value = 'A' THEN 1 ELSE 0 END) AS Active, 
     SUM(CASE WHEN CustomerStatus_Value = 'B' THEN 1 ELSE 0 END) AS Blocked, 
     SUM(CASE WHEN CustomerStatus_Value = 'C' THEN 1 ELSE 0 END) AS Cancelled, 
     COUNT(*) AS All 
    FROM CustomerStatusEntries 
    GROUP BY Branch; 
1

Vous pouvez le faire avec la norme SQL:

select branch_code, 
     sum(case when CustomerStatus_Value = 'E' then 1 else 0 end) as Created, 
     sum(case when CustomerStatus_Value = 'B' then 1 else 0 end) as Blocked, 
     ... 
from t 
group by branch_code 
order by 1