2015-03-25 34 views
-1

在SQL Server中,我有一個表,那裏有15列,列中包含數據SL,PLCL8,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 

就像上面我的桌子在那裏,現在我想計算每個empid的PL或CL或SL,請幫助我。

+0

我試圖顯示在一個問題表格式,但它不來,所以 – Datha 2015-03-25 12:14:47

+0

什麼會您查詢的結果是什麼樣子? – Tanner 2015-03-25 12:17:00

+1

請勿以這種方式存儲您的值。而是在通過外鍵鏈接到此表的新表中使用單列「值」。那麼編寫查詢就容易多了,而且效率也更高。如果你需要上面的格式,你可以使用'PIVOT'。 – 2015-03-25 12:17:02

回答

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

謝謝Ic,爲您提供幫助。 – Datha 2015-03-27 06:29:32

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