Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Group By - Générer plusieurs colonnes agrégées à partir d'une seule colonne

Vous pouvez le faire en utilisant des sous-requêtes corrélées comme ceci :

SELECT 
  Company, 
  Date, 
  (SELECT COUNT(*) FROM MyTable AS T1 
     WHERE T1.Flag='Y' AND T1.Company=T2.Company AND T1.Date=T2.Date) AS Count_Y,
  (SELECT COUNT(*) FROM MyTable AS T1 
     WHERE T1.Flag='N' AND T1.Company=T2.Company AND T1.Date=T2.Date) AS Count_N
FROM MyTable AS T2
GROUP BY Company, Date

Vous pouvez également le faire de manière plus concise, mais peut-être avec (sans doute) un peu moins de lisibilité en utilisant le SUM astuce :

SELECT 
  Company, 
  Date, 
  SUM(CASE WHEN Flag='Y' THEN 1 ELSE 0 END) AS Count_Y,
  SUM(CASE WHEN Flag='N' THEN 1 ELSE 0 END) AS Count_N,
FROM MyTable
GROUP BY Company, Date

Dans Oracle/PLSQL, le DECODE la fonction peut être utilisée pour remplacer le CASE pour le plus concis :

SELECT 
  Company, 
  Date, 
  SUM(DECODE(Flag,'Y',1,0)) AS Count_Y,
  SUM(DECODE(Flag,'N',1,0)) AS Count_N,
FROM MyTable
GROUP BY Company, Date