Условное суммирование одного и того же столбца несколько раз в одном операторе выбора? - PullRequest
3 голосов
/ 29 апреля 2010

У меня есть одна таблица, в которой показаны развертывания сотрудников для различных типов развертываний в заданном месте для каждого месяца:

ID | Location_ID | Date | NumEmployees | DeploymentType_ID

В качестве примера можно привести несколько записей:

 1 | L1 | 12/2010 | 7 | 1 (=Permanent)
 2 | L1 | 12/2010 | 2 | 2 (=Temp)
 3 | L1 | 12/2010 | 1 | 3 (=Support)
 4 | L1 | 01/2011 | 4 | 1
 5 | L1 | 01/2011 | 2 | 2
 6 | L1 | 01/2011 | 1 | 3
 7 | L2 | 12/2010 | 6 | 1
 8 | L2 | 01/2011 | 6 | 1
 9 | L2 | 12/2010 | 3 | 2

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

Date    | Total Perm | Total Temp | Total Supp
12/2010 |     13     |     5      |      1
01/2011 |     10     |     2      |      1

В настоящее время я создал отдельный запрос для каждого типа развертывания, который выглядит следующим образом:

SELECT Date, SUM(NumEmployees) AS "Total Permanent"
FROM tblDeployment
WHERE DeploymentType_ID=1
GROUP BY Date;

Мы назовем этот запрос qSumPermDeployments. Затем я использую пару объединений для объединения запросов:

SELECT qSumPermDeployments.Date, qSumPermDeployments.["Total Permanent"] AS "Permanent"
    qSumTempDeployments.["Total Temp"] AS "Temp"
    qSumSupportDeployments.["Total Support"] AS Support
FROM (qSumPermDeployments LEFT JOIN qSumTempDeployments 
    ON qSumPermDeployments.Date = qSumTempDeployments.Date) 
LEFT JOIN qSumSupportDeployments 
    ON qSumPermDeployments.Date = qSumSupportDeployments.Date;

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

Итак, наконец, мой вопрос. Есть ли способ упростить это до одного запроса или лучше разделить его на несколько запросов - если ни по какой другой причине эта удобочитаемость.

Ответы [ 2 ]

4 голосов
/ 29 апреля 2010
SELECT Date, 
    SUM(case when DeploymentType_ID = 1 then NumEmployees else null end) AS "Total Permanent", 
    SUM(case when DeploymentType_ID = 2 then NumEmployees else null end) AS "Total Temp", 
    SUM(case when DeploymentType_ID = 3 then NumEmployees else null end) AS "Total Supp"
FROM tblDeployment
GROUP BY Date
1 голос
/ 29 апреля 2010

Попробуйте это:

SELECT
    Date,
    SUM(CASE WHEN DeploymentType_ID=1 THEN NumEmployees ELSE 0 END) AS "Total Permanent",
    SUM(CASE WHEN DeploymentType_ID=2 THEN NumEmployees ELSE 0 END) AS "Total Temporary",
    SUM(CASE WHEN DeploymentType_ID=3 THEN NumEmployees ELSE 0 END) AS "Total Support"
FROM tblDeployment
GROUP BY Date;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...