2017-02-09 2 views
3

У меня есть таблица, как этотSQLite: результаты Как совместить подзапрос

id | inventory_id | serial_type | serial 
------------------------------------------------------ 
    38 |  5892  |  1  | 9502 
    39 |  5895  |  1  | i95054-1 
    40 |  5895  |  2  | m95054-1 
    41 |  5895  |  1  | i95054-2 
    42 |  5895  |  2  | m95054-2 
    43 |  5895  |  1  | i95054-3 
    44 |  5895  |  2  | m95054-3 
    45 |  5895  |  1  | i95054-4 
    46 |  5895  |  2  | m95054-4 

У меня 2 подзапросов из той же таблицы, как

SELECT inventory_id, serial as type_one_serial 
FROM serials 
WHERE serial_type = 1 
AND inventory_id = 5895 

и другой

SELECT inventory_id, serial as type_two_serial 
FROM serials 
WHERE serial_type = 2 
AND inventory_id = 5895 

Как я могу чтобы получить такой результат, как

inventory_id | type_one_serial | type_two_serial 
------------------------------------------------ 
5895   | i95054-1  | m95054-1 
5895   | i95054-2  | m95054-2 
5895   | i95054-3  | m95054-3 
5895   | i95054-4  | m95054-4 

EDIT: Я изменил исходную таблицу в Iclude другой колонке sl

sl | id | inventory_id | serial_type | serial 
---------------------------------------------------------------- 
    0 | 38 |  5892  |  1  | 9502 
    0 | 39 |  5895  |  1  | i95054-1 
    0 | 40 |  5895  |  2  | m95054-1 
    1 | 41 |  5895  |  1  | i95054-2 
    1 | 42 |  5895  |  2  | m95054-2 
    2 | 43 |  5895  |  1  | i95054-3 
    2 | 44 |  5895  |  2  | m95054-3 
    3 | 45 |  5895  |  1  | i95054-4 
    3 | 46 |  5895  |  2  | m95054-4 
+0

Вы должны показать нам общий формат 'столбца serial', если вы хотели бы быть в состоянии справиться с любым' inventory_id'. –

+0

@TimBiegeleisen: столбец 'serial' определен пользователем и является буквенно-цифровым –

+0

. Я имел в виду общую форму, если она известна. В любом случае, я дал вам запрос ниже, который должен работать, по крайней мере, для образцов данных, которые вы нам показали. –

ответ

3

Вы ищете запрос шарниром:

SELECT inventory_id, 
     MAX(CASE WHEN serial_type = 1 THEN 'i' || SUBSTR(serial, 2) END) AS type_one_serial, 
     MAX(CASE WHEN serial_type = 2 THEN 'm' || SUBSTR(serial, 2) END) AS type_two_serial 
FROM serials 
WHERE serial_type IN (1, 2) AND  -- the WHERE clause may be optional 
     inventory_id = 5895   -- depending on what you want 
GROUP BY inventory_id, 
     SUBSTR(serial, 2) 

Update:

Принимая во внимание новую колонку sl, мы может использовать это для различения двух типов серий для данного inventory_id. В этом случае мы могли бы написать следующий запрос:

SELECT inventory_id, 
     MAX(CASE WHEN serial_type = 1 THEN serial END) AS type_one_serial, 
     MAX(CASE WHEN serial_type = 2 THEN serial END) AS type_two_serial 
FROM serials 
GROUP BY inventory_id, 
     sl 
+0

Спасибо Тиму за ваше время! Но я думаю, что это не точный код, который я ищу. Поскольку столбец 'serial' определяется пользователем, я не могу выполнить' SUBSTR'. –

+0

Если вы хотите повернуть, нам нужно знать структуру столбца 'serial'. У вас есть какие-то требования? –

+0

'serial' берется из текстового поля ввода пользователя, который может вводить любой буквенно-цифровой набор символов, говорящий до 50. Вышеуказанные данные - это всего лишь некоторые тестовые данные, в действительности это будут любые случайные символы. Надеюсь, я ответил на ваш вопрос. –

0

Редактированный ответ @Tim Biegeleisen отлично работал для меня. На этом я сделал несколько изменений. Не уверен, что он будет делать какие-либо улучшения, просто размещением здесь для справки:

SELECT inventory_id, MAX(CASE WHEN serial_type = 1 THEN serial END) AS type_one_serial, MAX(CASE WHEN serial_type = 2 THEN serial END) AS type_two_serial FROM serials WHERE inventory_id = 5895 GROUP BY sl

+0

Это приемлемо, если вы хотите посмотреть только на 'inventory_id'. Мой ответ будет охватывать всю таблицу. –

+0

Одно редактирование: вы не можете выбрать 'inventory_id' сейчас, потому что он не появляется в предложении GROUP BY. Поэтому я выбрал его как постоянный текст. –

+0

Спасибо @TimBiegeleisen! Мой фактический код немного отличается (Отредактировано снова) :) –

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