2015-07-17 2 views
0

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

Пример исходной таблицы:

Type  Status I1 I2 I3 I4 I5 
A   ON  3  4  2  10 2 
A   OFF  1  1  0  null null 
B   ON  5  6  2  10 2 
B   OFF  2  1  2  null null 
C   ON  8  7  5  10 2 
C   OFF  1  1  1  null null 
A   ON  4  4  4  10 2 
A   OFF  2  2  1  null null 
B   ON  5  4  5  10 2 
B   OFF  1  1  1  null null 

Так, в принципе, что Я хотел бы, чтобы объединить I значения из ON и OFF статуса, следующим образом:

Беря приведенный выше таблицу, значение I1, I2, I3 от OFF status станет I6, I7, I8 выход будет

Type  I1 I2 I3 I4 I5 I6 I7 I8 
A  3  4  2  10 2  1  1 0 
B  5  6  2  10 2  2  1 2 
C  8  7  5  10 2  1  1 1 
A  4  4  4  10 2  2  2 1 
B  5  4  5  10 2  1  1 1 

Чтобы было ясно, что это будет сделать, это просто принимать значения I1, I2 и I3 от OFF status каждого type и положить их вместе с результаты от ON status как I6, I7, I8

+0

У вас есть столбец 'id'? – konart

+0

извините, да, я всегда забываю разместить столбцы идентификаторов, он присутствует в качестве первичного ключа – codeKiller

+0

Что вы хотите сделать со вторым набором типов A и Type B? Должны ли они быть отдельной строкой? Не могли бы вы дать нам еще одну строку ожидаемого выхода? –

ответ

2

Если вы id столбца автоинкрементный и он не имеет пробелов, то вы можете быть в удаче

select o1.*, o2.i1 as i6, o2.i2 as i7, o2.i3 as i8 
from original o1 join 
    original o2 
    on o2.id = o1.id + 1 and 
     o2.type = o1.type and 
     o1.status = 'ON' and o2.status = 'OFF'; 

В противном случае, этот запрос намного сложнее, чем это кажется. Вам нужно сгруппировать похожие id s. Один из методов состоит в том, чтобы идентифицировать их по числу аналогичных строк одного типа и ON. Вы можете получить это с помощью коррелированного подзапроса:

with o as (
     select o.*, 
      (select count(*) 
       from original o2 
       where o2.type = o.type and o2.status = 'ON' and o2.id <= o.id 
      ) as grp 
     from original o 
    ) 
select o.type, 
     max(case when type = 'ON' then i1 end) as i1, 
     max(case when type = 'ON' then i2 end) as i2, 
     max(case when type = 'ON' then i3 end) as i3, 
     max(case when type = 'ON' then i4 end) as i4, 
     max(case when type = 'ON' then i5 end) as i5, 
     max(case when type = 'OFF' then i1 end) as i6, 
     max(case when type = 'OFF' then i2 end) as i7, 
     max(case when type = 'OFF' then i3 end) as i8 
from o 
group by grp, type ; 
0

Попробуйте это:

SELECT Type, SUM(I1) AS I1, SUM(I2) AS I2, SUM(I3) AS I3, SUM(I4) AS I4, SUM(I5) AS I5, SUM(I6) AS I6, SUM(I7) AS I7, SUM(I8) AS I8 
FROM (
    SELECT Type, I1, I2, I3, I4, I5, 0 As I6, 0 As I7, 0 As I8 
    FROM YourTable 
    WHERE Status = 'ON' 
    UNION ALL 
    SELECT Type, 0 , 0, 0, 0, 0, I1 As I6, I2 As I7, I3 As I8 
    FROM YourTable 
    WHERE Status = 'OFF') DT 
GROUP BY Type 
+0

buff ... спасибо shA, я еще не очень хорош с SQL, нужно некоторое время, чтобы прочитать и понять эту большую вещь – codeKiller

+0

Возможно, вам нужно немного изменить свой ответ в соответствии с последним изменением моего вопрос ... I thinnk Я didnt объяснить правильно в первый раз, я обновил вопрос с большим количеством строк в желаемом выходе – codeKiller

+0

@newPyUser Можете ли вы объяснить, как вы указываете строку с статусом 'OFF' в строку с' ON 'статус, где для каждого из них имеется более одного типа? –

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