Как добавить столбцы на основе количества подзапросов в SQL Server 2005 - PullRequest
0 голосов
/ 02 августа 2011

У меня есть следующий SQL

DECLARE @StatusOK int
DECLARE @StatusFailed int

SELECT @StatusOK = COUNT(Status) FROM tblAuditServiceLog WHERE Status = '1'
SELECT @StatusFailed = COUNT(Status) FROM tblAuditServiceLog WHERE Status = '2'

SELECT CompanyId, MethodCalled, tblSystemCompany.Description, @StatusOK as StatusOK, @StatusFailed as StatusFail
FROM tblAuditServiceLog 
INNER JOIN tblSystemCompany ON tblAuditServiceLog.CompanyId = tblSystemCompany.SystemCompanyId
GROUP BY MyId, MethodCalled, tblSystemCompany.Description

Это работает, но счет не основан на CompanyId (строке), он возвращает счетчик по таблице, поэтому он немного бесполезен.

Из двух таблиц, подобных этой

:: tblAuditServiceLog 
| CompanyId | MethodCalled | Status |
| 232       | GetProducts  |    1   |

:: tblSystemCompany
| SystemCompanyId | Description |
| 232             | MyCompany   |

Где Status = 1 в порядке, 2 - Fail

В идеале я бы получил такой вывод ...

| CompanyId | MethodCalled | Description | StatusOK | StatusFail |
| 232       | GetProducts  | MyCompany   |    8     |     2      |
| 236       | GetProducts  | MyCompanyB  |    8     |     2      |
| 256       | GetBrands    | MyCompanyC  |    8     |     2      |

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

Любая помощь от некоторых гениев SQL Server приветствуется

Приведенные выше результаты (в соответствии с двумя запросами Select @) являются результатами подсчета всех Статусов = 1 (статус в норме) и всех статусов = 2 (сбой статуса), а не, как и должно быть, Статус = И CompanyId = 232

Таким образом, предполагая, что несколько компаний зарегистрированы, выполняя различные вызовы веб-службы, счет будет основываться на общем количестве «OK Status», а не на количестве для этой компании.

Ответы [ 2 ]

4 голосов
/ 02 августа 2011

Вам просто нужен условный COUNT.

SELECT
     MyId, MethodCalled, Description,
     COUNT(CASE Status WHEN 1 THEN tblAuditServiceLog.MyId END) AS StatusOK, 
     COUNT(CASE Status WHEN 2 THEN tblAuditServiceLog.MyId END) AS StatusFail 
FROM 
    ...
  • В этом случае есть подразумеваемое значение ELSE NULL
  • COUNT игнорирует NULL
  • Возможно, вам нужно DISTINCTв COUNT так (COUNT(DISTINCT CASE...), но, вероятно, нет

Наблюдения:

  • Ваш WHERE не нужен. "Условие совпадения таблицы" уже находится в JOIN
  • Использование псевдонимов и уточняющих столбцов

Итак (предположения, сделанные относительно столбцов MethodCalled и Description)

SELECT  ASL.CompanyId, 
        ASL.MethodCalled, 
        SI.Description, 
        COUNT(CASE ASL.Status WHEN 1 THEN ASL.CompanyId END) AS StatusOK, 
        COUNT(CASE ASL.Status WHEN 2 THEN ASL.CompanyId END) AS StatusFail

FROM    dbo.tblAuditServiceLog AS ASL INNER JOIN
        dbo.tblSystemCompany AS 
        SI ON ASL.CompanyId = SI.SystemCompanyId

GROUP BY ASL.CompanyId, ASL.MethodCalled, SI.Description
2 голосов
/ 02 августа 2011
SELECT 
    MyId, 
    MethodCalled, 
    Description, 
    StatusOK   = SUM(CASE WHEN Status = '1' THEN 1 ELSE 0 END),
    StatusFail = SUM(CASE WHEN Status = '2' THEN 1 ELSE 0 END)
FROM tblAuditServiceLog ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...