如何编写以下SQL case语句?

时间:2011-03-01 22:04:13

标签: tsql 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**

但是上面的查询不起作用,我可以理解为什么..但是任何人都可以帮我编写一个查询,它基本上可以帮助我将所有四个var_values存储在我拥有的四个变量中,方法是检查{{ 1}}?

4 个答案:

答案 0 :(得分:2)

您需要将结果集合成一行,以避免在不同时间分配相同的变量。由于它代表结果集中的每一行,因此分配了变量,这意味着在分配后,其中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

答案 1 :(得分: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;

答案 2 :(得分: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'

答案 3 :(得分:0)

你必须像这样使用它:

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

事情是,看起来你的所有情况都会给出相同的结果,所以我不明白你想要做什么。