2010-11-19 15 views
5

Opracowuję małą procedurę składowaną na serwerze SQL 2008. Mam małą wiedzę na temat zapytań SQL, ale wystarczającą do realizacji prostych zadań. Jednak pojawił się problem, którego sam nie potrafię rozwiązać. Zanim zacznę wyjaśniać mój problem, przepraszam, jeśli wypisuję słowo-zapytanie SQL, ponieważ nie jestem native speakerem języka angielskiego.Jak podsumować pole w zależności od wartości innego pola?

mam 4 pola (reprezentacja 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  

Co chcesz zrobić, to grupa o wyborze przez jego ID i NAME, Podsumowując jest to wartość w polu o nazwie positive when ANSWER = 1 i negative when ANSWER = 0.

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

Chyba moje pytanie został poproszony kilka razy, ale nie był w stanie znaleźć nic na ten temat, prawdopodobnie dlatego, że używam niewłaściwych warunkach. W każdym razie, jeśli ktoś mógłby pomóc, zaoszczędziłoby mi to wiele czasu.

+0

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

+0

+1, tylko dlatego, że w rzeczywistości jest to całkiem niezłe zadane pytanie. (Również dzięki redaktorowi). Ma proste, przykładowe dane wejściowe i pokazuje pożądany zestaw wyników. – Matt

+0

Zgadzam się z Mattem, jest to dobrze zilustrowane pytanie, a cel jest jasny jak woda. To bardzo pomaga osobom, które nie mówią po angielsku. =) –

Odpowiedz

4

Zrobisz to za pomocą instrukcji CASE.

+0

Myślę, że musisz usunąć wartości z zaznaczenia i grupy według klauzul – houlgap

+0

@houlgap: To zauważyłem po ponownym przeczytaniu pytania po raz trzeci, aby upewnić się, że zrozumiałem to pytanie. Dzięki, że mnie powiadomiłeś, to miłe! =) –

+0

@Ephismen: Czy to właściwie odpowiada na twoje pytanie? Czy poprawnie zrozumiałem twoją potrzebę, czy też brakuje mi czegoś? –

2

Przepisz swój SQL z kolumny, takie jak ten:

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

1

Ephismen,

przykładzie dajesz posiada ukryty problem w tym. Czy zawsze będziesz miał co najmniej jeden pozytywny i jeden negatywny? Co chcesz zrobić, jeśli masz tylko jedną lub drugą, a nie obie. Dołączenie do samej tabeli nie będzie działać, jeśli masz wiele wierszy dla każdego identyfikatora i nazwy.

unii dwóch oddzielnych zapytań będzie w stanie odpowiedzieć na te pytania, ale nie jestem pewien, czy ma ona zastosowanie dla serwera SQL 2008.

Możesz być w stanie osiągnąć to za pomocą klauzuli GROUP BY do SQL następująco :

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 

tymczasowa tabela (wewnętrzna wybierz z Unii) zwróci wiersze podobne do tego:

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

ostateczna wybierz powróci żądany resu (podsumowując je razem).

+0

W moim przypadku zawsze będą oba, więc nie muszę się tym martwić, ale to, co wskazałeś, jest prawdą. Ocalę ci odpowiedź na wypadek, gdy pewnego dnia będę musiał stawić czoła temu problemowi, a ja go daję +1, ponieważ może to pomóc innym. – Aymeric

Powiązane problemy