2015-03-25 2 views
-1

В SQL Server у меня есть одна таблица, в которой есть 15 столбцов, столбцы содержат данные SL, PL, CL или 8, 4 вот так.Как подсчитать значения столбцов в строке таблицы?

empid D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15 
================================================================== 
sam PL 8 PL 4 8 SL 8 SL 4 CL 8 CL 8 8 8 
sunny 8  CL 4 CL SL 8 4 SL 4 PL 8 8 8 8 8 
zimmy 4  4 4 8 8 8 4 4 8 8 8 8 8 8 8 

Как и выше моей таблице есть, теперь я хочу, чтобы вычислить PL или CL или SL каждого EmpId, пожалуйста, помогите мне.

+0

я пытался показать формат таблицы в вопросе, но он не приходит, – Datha

+0

так, что бы результат вашего запроса выглядеть? – Tanner

+1

Не храните ваши значения таким образом. Вместо этого используйте одну колонку «Значение» в новой таблице, которая связана с этой таблицей с помощью внешнего ключа. Тогда гораздо проще писать ваши запросы, и это также более эффективно. Если вам нужен формат выше, вы можете использовать 'PIVOT'. –

ответ

1

Необходимость агрегирования столбцов в одной строке является хорошим индикатором того, что вы неправильно храните данные. Я бы поменял его на следующее:

 
empid D_number val 
sam 1   PL 
sam 2   8 
sam 3   PL 

В этом случае вы можете просто сделать счет или условную сумму. Например, условная сумма, чтобы получить как PL и SL рассчитывает на одном дыхании:

select empid, sum(case when val = 'PL' then 1 else 0 end), 
    sum(case when val = 'SL' then 1 else 0 end) 
from myTable 
group by empid 

Или, если вы просто заинтересованы в PL счета, вы можете просто COUNT:

select empid, count(*) 
from myTable 
where val = 'PL' 
group by empid 

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

  1. условная сумма по каждой колонке в явном виде (мальчик делает это становится уродливым быстро):

    select empid, 
        case when d1 = 'PL' then 1 else 0 end + 
         case when d2 = 'PL' then 1 else 0 end + 
         case when d3 = 'PL' then 1 else 0 end + 
         ..., 
        case when d1 = 'SL' then 1 else 0 end + 
         case when d2 = 'SL' then 1 else 0 end + 
         case when d3 = 'SL' then 1 else 0 end + 
         ... 
    from myTable 
    
  2. UNPIVOT данные, чтобы сделать его похожим на форму выше, а затем использовать условную сумму:

    with cte as (
        select empid, D_number, val 
        from (
         select empid, d1, d2, d3, d4, d5, ... 
         from myTable 
        ) x 
        unpivot (val for D_number in 
         (d1, d2, d3, d4, d5, ...) 
        ) 
    ) 
    select empid, sum(case when val = 'PL' then 1 else 0 end), 
        sum(case when val = 'SL' then 1 else 0 end) 
    from cte 
    group by empid 
    
+0

Спасибо, я за вашу помощь. – Datha

1

Используйте UNPIVOT

тестовых данных и таблица:

DECLARE @t table 
(empid varchar(10), D1 char(2), D2 char(2), D3 char(2), D4 char(2),D5 char(2), 
D6 char(2),D7 char(2), D8 char(2), D9 char(2),D10 char(2), D11 char(2), 
D12 char(2), D13 char(2), D14 char(2), D15 char(2)) 
INSERT @t values 
('sam', 'PL','8','PL','4','8','SL','8','SL','4','CL','8','CL','8','8','8'), 
('sunny','8','CL','4','CL','SL','8','4','SL','4','PL','8','8','8','8','8'), 
('zimmy','4','4','4','8','8','8','4','4','8','8','8','8','8','8','8') 

Запрос:

SELECT empid, value, count(*) count 
FROM @t as p 
UNPIVOT  
(value FOR col IN   
([D1],[D2],[D3],[D4],[D5],[D6],[D7],[D8],[D9], 
[D10],[D11],[D12],[D13],[D14],[D15])) AS unpvt 
WHERE value in ('PL','CL','SL') 
GROUP BY empid, value 

Результат:

empid value count 
sam  CL  2 
sam  PL  2 
sam  SL  2 
sunny CL  2 
sunny PL  1 
sunny SL  2 
Смежные вопросы