2011-03-01 156 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;