SQL-запрос для подсчета сгруппированных элементов - PullRequest
0 голосов
/ 03 декабря 2009

У меня есть таблица со следующими столбцами:

agent     status  

A          Mail Sent  
B          Fax Sent  
A          Fax Sent  
B          Mail Sent  
B          Mail Sent  
B          Fax Sent  

Я хочу получить такой результат:

Agent  Fax_Count    Mail_Count

A      1            1  
B      2            2  

Ответы [ 5 ]

7 голосов
/ 03 декабря 2009

Вы можете попробовать что-то вроде этого

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
1 голос
/ 03 декабря 2009

В качестве альтернативы (хорошему) решению astander:

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

В зависимости от распределения ваших данных производительность может быть лучше, чем его решение (без SUM по вычисляемому полю), или хуже (подвыборы) или равной (если анализатор запросов находит оптимальный план выполнения в обоих случаях).

0 голосов
/ 04 декабря 2009

Это новый способ (начиная с SQL Server 2005) для решения проблемы с использованием функциональности 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

Я не использую это сам по себе из-за более сложного синтаксиса, но, возможно, есть какая-то производительность, чтобы выиграть?

0 голосов
/ 03 декабря 2009

Вы могли бы сделать это ... вероятно, не самое изящное, но это сработало бы ... Просто поменяйте @Table таблицей, к которой вы обращаетесь ...

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 голосов
/ 03 декабря 2009
  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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...