2016-03-02 2 views
1

Это мой фактический стол ...SQL pivot/join table?

ID  SEQ   HOURS  ROUTER 

1   1000  13   Old 
1   2000  23   Old 
1   3000  17   Old 

2   1111  43   New 
2   2222  40   New 

3   1111  16   New 
3   2222  18   New 

4   1000  19   Old 
4   2000  31   Old 
4   3000  10   Old 

Это мой желаемый стол ...

ID  ALPHA  BRAVO 

1   36   17  
2   43   40 
3   16   18 
4   50   10 

Там должна быть какая-то логика здесь, где я могу сказать что-то вроде:

Old Router's 1000 + 2000 = Alpha 
New Router's 1111 = Alpha 

Old Router's 3000 = Bravo 
New Router's 2222 = Bravo 

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

Я не уверен, что то, что я ищу, лучше всего сделать за пределами базы данных на другом языке, но надеялось сделать это в sql, поэтому к тому времени, как я верну данные, я мог бы просто использовать его. Любая помощь будет оценена по достоинству.

ответ

3

Вы ищете условную агрегацию?

select id, 
     sum(case when router = 'old' and seq in (1000, 2000) then hours 
       when router = 'new' and seq = 1111 then hours 
       else 0 
      end) as alpha, 
     sum(case when router = 'old' and seq in (3000) then hours 
       when router = 'new' and seq = 2222 then hours 
       else 0 
      end) as bravo 
from t 
group by id; 
+1

Это прекрасно работает и не требует объединений и шарниров, поэтому большое спасибо! – Slime