2013-03-12 32 views
0

這裏是我的返回數據是如何構成一個簡單的例子:使用CASE語句重新分配價值 - T-SQL

id | cat id | value | reverse 
1 | 1  | 5  | false 
2 | 1  | 5  | false 
3 | 2  | 2  | true 
4 | 2  | 1  | false 
5 | 1  | 3  | true 

在下面的SQL語句,我試圖讓每個value類型計數由value分組組成。如果reverse列爲真,則需要反轉比例。因此,規模將是:

5 = 1 
4 = 2 
3 = 3 
2 = 4 
1 = 5 

我嘗試下面的SQL語句,但它似乎並沒有被施加反規模計,它只是忽略了反轉標記一起:

select value, count(
case reverse 
    WHEN false THEN 
     CASE value 
     WHEN '5' THEN '1' 
     WHEN '4' THEN '2' 
     WHEN '3' THEN '3' 
     WHEN '2' THEN '4' 
     WHEN '1' THEN '5' 

    END 
    ELSE value 
END 
) 
from table1 
group by value 

我做錯了什麼?如何應用反向邏輯將反向問題值計數到正確的值?

+0

是不是一個整數值? – 2013-03-12 20:05:23

+0

這是一個varchar,但我可以投到整數 – 2013-03-12 20:32:57

回答

1

所以我可能是誤解;如果是的話,我表示歉意。但我的理解是,你想獲得絕對值的計數....所以如果我有五行的值爲1和五行的值爲5(反向),我想節目有10的計數爲1

假設是這樣的話和你有一個字符串,而不是一個int(值,但該值都是整數,而不是更復雜的東西:

;WITH reversed AS 
    (
     SELECT id, 
      [cat id], 
      CASE WHEN [reverse] = 1 THEN 6 - CAST([value] AS INT) 
       ELSE CAST([value] AS INT) END AS [calcValue] 
     FROM table1 
    ) 
    SELECT calcValue, COUNT(id) AS counts 
    FROM reversed 
    GROUP BY calcValue; 

部分原始計算問題的原因是你在分組之前沒有對原始值進行任何處理,只是計算了case語句的計數。如果其中的值不同,那麼COUNT()不會有區別,只要價值es不是NULL

0

試試這個:

with data as ( 
    select * from (values 
    (1,1,5,'false'), 
    (2,1,5,'false'), 
    (3,2,2,'true'), 
    (4,2,1,'false'), 
    (5,1,3,'true') 
    ) data(id,cat,value,reverse) 
) 
select 
    id, 
    cat, 
    value = case when reverse='false' then value else 6-value end 
from data 

返回此:

id   cat   value 
----------- ----------- ----------- 
1   1   5 
2   1   5 
3   2   4 
4   2   1 
5   1   3