2016-03-18 2 views
0

У нас есть таблица [КПЭ], который выглядит следующим образом:Группируйте по сумме и сумме на основе значений столбцов без sum() over()?

RawId EmpId  Date   Hour Min KpiValue KpiName 
106  ABC123 20160310  8  0  3   Kpi1 
124  ABC123 20160310  8  0  65   Kpi1 
121  ABC123 20160310  8  15 12   Kpi2 
109  ABC109 20160310  8  0  34   Kpi2 
112  ABC908 20160310  9  5  3   Kpi1 
118  ABC907 20160310  8  30 24   Kpi1 
115  ABC123 20160310  8  15 54   Kpi1 

Я хотел бы группу EmpId, KpiName, дата, час. Так, например, с помощью этих данных, Kpi1 для EmpId ABC123 в час будет .

Так что я попытался использовать оператор CASE, но результат неверен. Я не проверял фактические итоги в результате, но суммы должны быть правильными. Это неправильный формат результата; каждый empid имеет две строки: одну для Kpi1 и одну для Kpi2.

select empid, 
case kpiname when 'Kpi1' then sum(kpivalue) end as 'Kpi1', 
case kpiname when 'Kpi2' then sum(kpivalue) end as 'Kpi2' 
from 
[Kpis] 
where kpiname in ('Kpi1', 'Kpi2') 
and date = 20160310 and hour = 8 
group by empid, kpiname, hour 

Как я могу использовать оператор Case для фиксации результатов?

Спасибо.

ответ

0

Поместите случай в вашей сумме, например, что вы для каждого KpiName только суммирует соответствующие значения.

SELECT 
    EmpId, 
    [Hour], 
    SUM(
     CASE 
      WHEN KpiName = 'Kpi1' THEN KpiValue 
      ELSE 0 
     END 
    ) Kpi1, 
    SUM(
     CASE 
      WHEN KpiName = 'Kpi2' THEN KpiValue 
      ELSE 0 
     END 
    ) Kpi2 
FROM 
    Kpis 
GROUP BY 
    EmpId, 
    [Hour] 

Это производит этот выход

EmpId Hour Kpi1 Kpi2 
ABC109 8  0  34 
ABC123 8  122  12 
ABC907 8  24  0 
ABC908 9  3  0 
0

SUM fucntion должен быть вне СЛУЧАЯ:

select empid, 
    sum(case kpiname when 'Kpi1' then kpivalue end) as 'Kpi1', 
    sum(case kpiname when 'Kpi2' then kpivalue end) as 'Kpi2' 
from 
    [Kpis] 
where kpiname in ('Kpi1', 'Kpi2') 
and date = 20160310 and hour = 8 
group by empid, kpiname, hour 
+0

вы должны добавить «ELSE 0» в ваших случаях, в противном случае будет возвращать NULL – FLICKER

+0

@FLICKER СЛУЧАЙ возвращается, когда не существует значения, которые соответствуют условию, в данном конкретном случае Kpi1 и Kpi2 существует NULL. – Balde

+0

Вы правы, но, как правило, это хорошая практика. – FLICKER

0

Вы также можете сделать это с функциональностью PIVOT, который я считаю, это то, что вы на самом деле пытаетесь достичь.

SELECT 
    * 
FROM (
    SELECT 
     EmpId, 
     KpiName, 
     [Hour], 
     KpiValue 
    FROM 
     Kpis 
) SourceTable 

PIVOT (
    SUM(KpiValue) 
    FOR KpiName 
    IN ([Kpi1],[Kpi2]) 
) PivotTable 

Какой дает этот выход. Обратите внимание на NULL в отличие от нулей, правильно отображая отсутствие данных.

EmpId Hour Kpi1 Kpi2 
ABC109 8  NULL 34 
ABC123 8  122  12 
ABC907 8  24  NULL 
ABC908 9  3  NULL 
Смежные вопросы