2009-12-03 4 views

Répondre

7

Vous pouvez essayer quelque chose comme ça

DECLARE @TABLE TABLE(
    agent VARCHAR(10), 
    status VARCHAR(10) 
) 

INSERT INTO @TABLE (agent,status) SELECT 'A','Mail Sent' 
INSERT INTO @TABLE (agent,status) SELECT 'B','Fax Sent' 
INSERT INTO @TABLE (agent,status) SELECT 'A','Fax Sent' 
INSERT INTO @TABLE (agent,status) SELECT 'B','Mail Sent' 
INSERT INTO @TABLE (agent,status) SELECT 'B','Mail Sent' 
INSERT INTO @TABLE (agent,status) SELECT 'B','Fax Sent' 

SELECT agent, 
     SUM(CASE WHEN status = 'Mail Sent' THEN 1 ELSE 0 END) Mail_Count , 
     SUM(CASE WHEN status = 'Fax Sent' THEN 1 ELSE 0 END) Fax_Count 
FROM @TABLE 
GROUP BY agent 
+0

Comme cette réponse (mieux que ce que je tapais). Le design de base de la table n'est pas très lisse pour moi (il ne semble pas avoir une clé primaire, est dénormalisé comme un enfer), et devrait probablement être changé. – Romain

0
select Name, SUM(MailSent),SUM(FaxSent) 
    from 
    (
    select 
    case Status when 'Mail Sent' then 1 else 0 end as MailSent , 
    case Status when 'Fax Sent' then 1 else 0 end as FaxSent , 
    Name 
    from Agents 
) tmp 
1

Comme alternative à l'astander (bonne) solution:

SELECT agent, 
     (SELECT COUNT(*) FROM myTable WHERE agent = t.agent AND status = 'Mail Sent') Mail_Count, 
     (SELECT COUNT(*) FROM myTable WHERE agent = t.agent AND status = 'Fax Sent') Fax_Count 
FROM myTable t 
GROUP BY agent 

En fonction de la distribution de vos données, la performance peut-être mieux que sa solution (pas SUM sur un champ calculé) ou pire (sous-Selects) ou égale (si l'analyseur de requêtes trouve la plan d'exécution optimal dans les deux cas).

+0

+1 pour ne pas utiliser une table temporaire –

+0

Merci. :-) Cependant, bien que je suis heureux de l'upvote, je devrais préciser que la solution d'astander n'a pas besoin d'une table temporaire; il l'utilise juste pour recréer la table originale de la question et illustrer sa solution. – Heinzi

+0

Bon point que j'ai observé précédemment, mais j'ai trouvé pour vraiment nouveaux développeurs SQL, cela pourrait être déroutant, pas une énorme chose de toute façon. –

0

Vous pouvez le faire ... sans doute pas le plus gracieux mais il travailleriez ... Tout swap sur @Table avec la table que vous interrogez ...

SELECT DISTINCT 
    T.AGENT, 
    (SELECT COUNT(AGENT) FROM @TABLE WHERE AGENT = T.AGENT AND Status LIKE 'Fax%') AS Fax_Count, 
    (SELECT COUNT(AGENT) FROM @TABLE WHERE AGENT = T.AGENT AND Status LIKE 'Mail%') AS Email_Count 
FROM 
    @TABLE T 
0

Voici la nouvelle manière (depuis SQL Server 2005) pour résoudre le problème en utilisant la fonctionnalité PIVOT:

SELECT agent, [Mail Sent] AS Mail_Count, [Fax Sent] AS Fax_Count 
FROM 
(
    SELECT T.agent, T.status, COUNT(*) AS Counter 
    FROM tblAgents AS T 
    GROUP BY T.agent, T.status 
) AS Data 
PIVOT 
(
    SUM(Counter) FOR [status] IN ([Mail Sent], [Fax Sent]) 
) AS PivotTable 

Je ne pas utiliser ce moi-même très souvent due à la syntaxe plus complexe, mais peut-être il y a un peu de performance pour gagner?

Questions connexes