Как написать следующую инструкцию SQL? - PullRequest
1 голос
/ 02 марта 2011

У меня есть такой набор результатов, как -

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 в четырех переменных, которые у меня есть, проверив var_names?

Ответы [ 4 ]

2 голосов
/ 02 марта 2011

Вам нужно поместить набор результатов в одну строку, чтобы избежать присвоения одним и тем же переменным 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**
* 1005.* Или же вы можете сохранить несколько назначений, но просто переназначить одно и то же значение обратно переменной, если обрабатываемая строка не является интересующей строкой.
   @min_points = CASE
                   WHEN var_name = 'min_points' THEN var_value
                   ELSE @min_points
                 END
1 голос
/ 02 марта 2011
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;
0 голосов
/ 02 марта 2011

Вы должны использовать это так:

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

Дело в том, что, похоже, все ваши дела дают одинаковый результат, поэтому я не понимаю, что вы пытаетесь сделать.

0 голосов
/ 02 марта 2011

Вам, вероятно, будет лучше сделать это в нескольких запросах

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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...