2011-03-01 100 views
1

我有一樣的結果集 -如何編寫以下SQL case語句?

Id  var_name var_value 
1  min_points  20 
2  max_points  120 
3  avg_points  50 
4  total_points 320 

這是我曾嘗試編寫一個查詢 -

select 
     @min_points =case 
      when var_name='min_points' then var_value 
     end, 
     @max_points=case 
      when var_name='max_points' then var_value 
     end, 
     @avg_points=case 
      when var_name='avg_points' then var_value 
     end, 
     @total_points= case 
      when var_name='total_points' then var_value 
     end 
    from 
     **joined multiple tables** 

但上面的查詢不工作,我能理解why..but誰能幫助我寫一個查詢,基本上可以幫助我通過檢查var_names將所有四個var_values存儲在四個變量中?

+1

在彙總中包裝case表達式。例如'@ max_points = max(var_name ='max_points',然後var_value結束的情況下)' – 2011-03-01 22:15:27

+0

@Martin作品謝謝! – Vishal 2011-03-01 22:18:44

回答

2

你需要得到的結果設置成單行,避免分配給同一變量4周不同的時間。由於它代表結果集中的每一行,所以變量被分配,這意味着在分配3之後將不符合條件並且是NULL並且1將是NOT NULL

select 
     @min_points =max(case 
      when var_name='min_points' then var_value 
     end), 
     @max_points=max(case 
      when var_name='max_points' then var_value 
     end), 
     @avg_points=max(case 
      when var_name='avg_points' then var_value 
     end), 
     @total_points= max(case 
      when var_name='total_points' then var_value 
     end) 
    from 
     **joined multiple tables** 

或者你也可以保持多任務只是重新分配相同的值返回到變量,如果處理的行不感興趣的行。

@min_points = CASE 
        WHEN var_name = 'min_points' THEN var_value 
        ELSE @min_points 
       END 
0

你可能會更好做這在多個查詢

select @min_points = var_value from activity where varmane = 'min_points' 
select @max_points = var_value from activity where varmane = 'max_points' 
select @avg_points = var_value from activity where varmane = 'avg_points' 
select @total_points = var_value from activity where varmane = 'total_points' 
+0

yea ..但實際上更新了問題..數據來自多個表..我想我可以包裝它,並一次選擇一個.. – Vishal 2011-03-01 22:10:49

0

你必須使用這樣的:

case (var_name) 
    case 'min_points' 
     var_value 
    case 'max_points' 
     var_value 
    default 
     var_value 
    end 

的事情是,雖然,它看起來像所有的情況下,給出相同的結果,所以我不明白你正在嘗試做。

1
create table #activity(
ID int, 
var_name varchar(20), 
var_value int, 
) 
INSERT INTO #activity VALUES(1,'min_points',20); 
INSERT INTO #activity VALUES(2,'max_points',120); 
INSERT INTO #activity VALUES(3,'avg_points',50); 
INSERT INTO #activity VALUES(4,'total_points',320); 

select MAX(CASE WHEN var_name='min_points' THEN var_value end)as min_points, 
    MAX(CASE WHEN var_name='max_points' THEN var_value end)as max_points, 
    MAX(CASE WHEN var_name='avg_points' THEN var_value end)as avg_points, 
    MAX(CASE WHEN var_name='total_points' THEN var_value end)as total_points 
    from #activity 

Drop Table #activity;