2010-11-19 6 views
5

Я разрабатываю небольшую хранимую процедуру на SQL Server 2008. У меня мало знаний по SQL-запросам, но достаточно для выполнения простых задач. Однако я придумал проблему, которую я не могу решить сам. Прежде чем я начну объяснять свою проблему, прошу простить меня, если я неправильно произнес слово SQL-слова, потому что я не являюсь носителем английского языка.Как подытожить поле в зависимости от другого значения поля?

У меня есть 4 поля (CSV представление):

ID, NAME, VALUES, ANSWER 
25, Tom , 2400 , 0     
25, Tom , 600 , 0     
25, Tom , 500 , 1     
25, Tom , 300 , 1     
27, Jerry, 100, 0     
27, Jerry, 20, 1     
27, Jerry, 60, 1     
27, Jerry, 2000, 0  

То, что я хочу сделать, это группа по выбору ее ID и NAME, обобщать это значения в поле с именем positive when ANSWER = 1 и negative when ANSWER = 0.

ID, NAME, SUM, NEGATIVE, POSITIVE 
25, Tom, 3000, 800     
27, Jerry, 2100, 80 

Я думаю, мой вопрос был задан несколько раз, но я не смог найти что-нибудь об этом, вероятно, потому, что я использую неправильные термины. В любом случае, если кто-то может помочь, это спасет меня много времени.

+0

http://stackoverflow.com/questions/30563/sql-returning-the-sum-of-items-depending-on-which-type-it-is – JNK

+0

+1, только потому, что это на самом деле довольно хорошо спросил вопрос. (Также благодаря редактору.) У этого есть простые, иллюстративные входные данные и фактически показывает желаемый набор результатов. – Matt

+0

Я согласен с Мэттом, это хорошо иллюстрированный вопрос, и цель понятна как вода. Это помогает многого для носителей английского языка. =) –

ответ

4

Вы сделаете это с помощью оператора CASE.

+0

Я думаю, вам нужно удалить значения из select и group by clauses – houlgap

+0

@houlgap: Это то, что я заметил, перечитав вопрос в третий раз, чтобы убедиться, что я понял вопрос. Спасибо, что сообщили мне об этом, это хорошо! =) –

+0

@Ephismen: Это правильно ответит на ваш вопрос? Правильно ли я понял вашу потребность, или что-то мне не хватает? –

2

перепишите SQL со столбцами, например, как это:

sum(case when answer=0 then values else 0 end) negative

1

Ephismen,

На примере вы даете имеет скрытые проблемы в нем. Будете ли вы иметь хотя бы один положительный и один отрицательный результат? Что вы хотите, если у вас есть только один или другой, а не оба. Присоединение таблицы к себе не будет работать, если у вас есть несколько строк для каждого идентификатора и имени.

союз двух отдельных запросов будет иметь возможность ответить на эти вопросы, но не уверен, если это применимо для сервера SQL 2008.

Вы можете быть в состоянии добиться этого с помощью группы пунктом для SQL следующим образом :

select id 
    , name 
    , sum (neg_values) as negative 
    , sum (pos_values) as positive 
    from         -- temporary table 
    (select id 
      , name 
      , sum (values) as neg_values 
      , 0   as pos_values -- placeholder 
     from mytable 
     where answer = 0     -- negative 
     group by id 
       , name 
     union all 
     select id 
      , name 
      , 0   as neg_values -- placeholder 
      , sum (values) as pos_values 
     from mytable 
     where answer = 1     -- positive 
     group by id 
       , name 
    ) 
    group by id 
     , name 

временная таблица (внутренний выбор с союзом) будет возвращать строки, подобные этим:

id name neg_value pos_value 
25 tom  3000   0 
25 tom   0  800 
27 jerry  2100   0 
27 jerry  0  80 

окончательный выбор будет вернуть нужный RESU lts (суммируя их вместе).

+0

В моем случае всегда будут оба, поэтому мне не нужно беспокоиться об этом, но то, что вы указали, верно. Я спасу вам ответ в случае, если однажды я столкнусь с этой проблемой, и я сделаю +1, поскольку это может помочь другим. – Aymeric

Смежные вопросы