2017-09-19 2 views
2

Je suis à la recherche d'un moyen de regrouper les données par statut. J'ai cela avec une sélection simple, juste pour la démonstration:SQL Group By statut

SQL Fiddle

MS SQL Server 2014 Configuration du schéma:

CREATE TABLE Projects ([ID] int, [Project] varchar(10)); 
INSERT INTO Projects ([ID], [Project]) 
VALUES 
    (1, 'Admin'), 
    (2, 'Accounts'), 
    (3, 'Finance') 
; 

CREATE TABLE Tasks ([ID] int, [ProjectID] int, [Task] int, [Status] varchar(8)); 
INSERT INTO Tasks 
    ([ID], [ProjectID], [Task], [Status]) 
VALUES 
    (1, 1, '001', 'Open'), 
    (2, 1, '002', 'Canceled'), 
    (3, 1, '003', 'Canceled'), 
    (4, 1, '004', 'Canceled'), 
    (5, 2, '005', 'Rejected'), 
    (6, 2, '006', 'Canceled'), 
    (7, 2, '007', 'Canceled'), 
    (8, 3, '008', 'Canceled'), 
    (9, 3, '009', 'Canceled'), 
    (10, 3, '010', 'Canceled'), 
    (11, 3, '011', 'Canceled'), 
    (12, 3, '0012', 'Rejected') 
; 

Requête 1:

SELECT 
    Projects.Project, 
    COUNT(Tasks.Status) AS Total 
FROM 
    Projects 
    LEFT JOIN Tasks ON Projects.ID = Tasks.ProjectID 
GROUP BY 
    Projects.Project 

Results:

| Project | Total | 
|----------|-------| 
| Accounts |  3 | 
| Admin |  4 | 
| Finance |  5 | 

Mais je suis à la recherche d'un moyen de sortie ceci:

| Project | Open | Canceled | Rejected | 
|----------|------|----------|----------| 
| Admin | 1 |  3 |   | 
| Accounts |  |  2 |  1 | 
| Finance |  |  4 |  1 | 

Les groupes de résultats souhaités du du projet par Tâches Statut. Comment puis-je faire ceci? Merci.

+0

Vérifiez les réponses à cette question, https://stackoverflow.com/questions/1241178/mysql-rows-to-columns, il devrait vous aider à composer votre propre problème – Floaterz

Répondre

3

Vous pouvez utiliser l'agrégation conditionnelle:

SELECT 
    Projects.Project 
    , [Open] = count(case when tasks.status='open' then 1 end) 
    , Canceled = count(case when tasks.status='Canceled ' then 1 end) 
    , Rejected = count(case when tasks.status='Rejected ' then 1 end) 
    , Total = COUNT(Tasks.Status) 
FROM 
    Projects 
    LEFT JOIN Tasks ON Projects.ID = Tasks.ProjectID 
GROUP BY 
    Projects.Project 

Fiddle: http://sqlfiddle.com/#!6/4b862/4/0

retours:

+----------+------+----------+----------+-------+ 
| Project | Open | Canceled | Rejected | Total | 
+----------+------+----------+----------+-------+ 
| Accounts | 0 |  2 |  1 |  3 | 
| Admin | 1 |  3 |  0 |  4 | 
| Finance | 0 |  4 |  1 |  5 | 
+----------+------+----------+----------+-------+ 
3

Vous pouvez utiliser cette requête.

Résultat:

Project Open  Canceled Rejected 
---------- ----------- ----------- ----------- 
Accounts 0   2   1 
Admin  1   3   0 
Finance 0   4   1