PIVOT в SQLIte - PullRequest
       18

PIVOT в SQLIte

1 голос
/ 14 сентября 2011

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

Это моя структура таблицы:

tbl_parameter

parameterid имя_параметра

tbl_parametervalues ​​

parameterid значение параметра

Фактическая структура в tbl_parameter

  --------------------------------
  ----------------------------------
  | parameterid |  parametername    |
  |----------------------------
  |   TYPE      |   Type            |
  |   TEMP      |   Temp(Deg.C)     |
  |   TIME      |   Time            |
  |   DATE      |   Date            |
  |  TECHNICIAN |   Technician      |
  |  TESTLENGTH |   Test Length     |
  |  TESTRESULT |   Test Result     |
  -----------------------------------

Фактическая структура в значениях tbl_parameter

  ------------------------------------
  | parameterid |  parametervalue    |
  |----------------------------
  |   TYPE      |   DW1            |
  |   TEMP      |   21             |
  |   TIME      |   10:45 PM       |
  |   DATE      |   14/09/2011     |
  |  TECHNICIAN |   Test1          |
  |  TESTLENGTH |   12             |
  |  TESTRESULT |   Pass           |
  |   TYPE      |   DW2            |
  |   TEMP      |   22             |
  |   TIME      |   11:45 PM       |
  |   DATE      |   15/09/2011     |
  |  TECHNICIAN |   Test2          |
  |  TESTLENGTH |   12             |
  |  TESTRESULT |   Pass           
  -----------------------------------

Я хочу, чтобы набор результатов выглядел так:

  -----------------------------------------------------------------------------
  | SL NO |  Type    | Temp |  Time  | Date     | Technician | Test   |Test   |
  |                                                          | Length |Result |
  ---------------------------------------------------------------------------
  | 1     | DW1      |  21  |10:45 PM|14/09/2011| Test1      | 12     | Pass  |
  | 2     | DW2      |  22  |11.45   | 15/09/2011| Test2     | 12     | Pass  |
  |------------------------------------------------------------------------------

Как я могу сделать это в SQLite?

1 Ответ

1 голос
/ 03 мая 2017

Я не смог найти определение того, как обнаружить наборы значений параметров, то есть какой «TEMP» принадлежит какому «TYPE». Поэтому я предполагаю, что наборы значений параметров всегда вводятся в базу данных последовательно и в порядке, указанном в вопросе. Комментарий ОП, кажется, позволяет это предположение. Не очень сложно (хотя и немного) реализовать некоторую устойчивость к перетасованным ордерам (связывая через обход параметрическими идентификаторами), но я надеюсь, что в этом нет необходимости.

Я также не смог найти информацию о том, что означает "SL NO" и откуда берется значение. Поэтому я притворяюсь, разделив значение rowid значения TESTRESULT на 7 (количество имен различных параметров, которое я считаю размером набора параметров). Не должно быть трудно выкопать правильные значения из вашей базы данных. Не требуется, чтобы значения rowid были кратны 7, если параметры вводятся последовательно. Просто «SL NO» может пропустить несколько чисел, если, например, rowids. «ТИП» - это кратные, например, 8, в противном случае запрос допускает разрывы между наборами параметров.

Вы можете найти часть моего MCVE, не относящуюся к запросу, в конце этого ответа.

Запрос:

select
    'SL NO',
    TYPE.parametername, 
    TEMP.parametername,
    TIME.parametername,
    DATE.parametername,
    TECHNICIAN.parametername,
    TESTLENGTH.parametername,
    TESTRESULT.parametername
from
    parameter TYPE,
    parameter TEMP,
    parameter TIME,
    parameter DATE,
    parameter TECHNICIAN,
    parameter TESTLENGTH,
    parameter TESTRESULT
where TYPE.parameterid='TYPE'
 and TEMP.rowid=TYPE.rowid+1
 and TIME.rowid=TYPE.rowid+2
 and DATE.rowid=TYPE.rowid+3
 and TECHNICIAN.rowid=TYPE.rowid+4
 and TESTLENGTH.rowid=TYPE.rowid+5
 and TESTRESULT.rowid=TYPE.rowid+6   

UNION ALL

select
    TESTRESULT.rowid/7,
    TYPE.parametervalue, 
    TEMP.parametervalue,
    TIME.parametervalue,
    DATE.parametervalue,
    TECHNICIAN.parametervalue,
    TESTLENGTH.parametervalue,
    TESTRESULT.parametervalue
from
    parametervalues TYPE,
    parametervalues TEMP,
    parametervalues TIME,
    parametervalues DATE,
    parametervalues TECHNICIAN,
    parametervalues TESTLENGTH,
    parametervalues TESTRESULT
where TYPE.parameterid='TYPE'
 and TEMP.rowid=TYPE.rowid+1
 and TIME.rowid=TYPE.rowid+2
 and DATE.rowid=TYPE.rowid+3
 and TECHNICIAN.rowid=TYPE.rowid+4
 and TESTLENGTH.rowid=TYPE.rowid+5
 and TESTRESULT.rowid=TYPE.rowid+6
 ;
  • создать одну таблицу на лету для каждого столбца сводных данных
  • выберите из каждой из этих таблиц запись для одного столбца
  • связать записи для одной и той же строки с помощью предположений (как указано выше) для rowids

Выход:

SL NO       Type           Temp(Deg.C)    Time           Date           Technician     Test Length    Test Result
1           DW1            21             10:45 PM       14/09/2011     Test1          12             Pass
2           DW2            22             11.45           15/09/2011    Test2          12             Pass

MCVE (.dump):

BEGIN TRANSACTION;
CREATE TABLE parametervalues(parameterid varchar(30), parametervalue varchar(30) );
INSERT INTO parametervalues(parameterid,parametervalue) VALUES('TYPE','DW1');
INSERT INTO parametervalues(parameterid,parametervalue) VALUES('TEMP','21');
INSERT INTO parametervalues(parameterid,parametervalue) VALUES('TIME','10:45 PM');
INSERT INTO parametervalues(parameterid,parametervalue) VALUES('DATE','14/09/2011');
INSERT INTO parametervalues(parameterid,parametervalue) VALUES('TECHNICIAN','Test1');
INSERT INTO parametervalues(parameterid,parametervalue) VALUES('TESTLENGTH','12');
INSERT INTO parametervalues(parameterid,parametervalue) VALUES('TESTRESULT','Pass');
INSERT INTO parametervalues(parameterid,parametervalue) VALUES('TYPE','DW2');
INSERT INTO parametervalues(parameterid,parametervalue) VALUES('TEMP','22');
INSERT INTO parametervalues(parameterid,parametervalue) VALUES('TIME','11.45');
INSERT INTO parametervalues(parameterid,parametervalue) VALUES('DATE',' 15/09/2011');
INSERT INTO parametervalues(parameterid,parametervalue) VALUES('TECHNICIAN','Test2');
INSERT INTO parametervalues(parameterid,parametervalue) VALUES('TESTLENGTH','12');
INSERT INTO parametervalues(parameterid,parametervalue) VALUES('TESTRESULT','Pass');
CREATE TABLE parameter (parameterid varchar(30), parametername varchar(30));
INSERT INTO parameter(parameterid,parametername) VALUES('TYPE','Type');
INSERT INTO parameter(parameterid,parametername) VALUES('TEMP','Temp(Deg.C)');
INSERT INTO parameter(parameterid,parametername) VALUES('TIME','Time');
INSERT INTO parameter(parameterid,parametername) VALUES('TATE','Date');
INSERT INTO parameter(parameterid,parametername) VALUES('TECHNICIAN','Technician');
INSERT INTO parameter(parameterid,parametername) VALUES('TESTLENGTH','Test Length');
INSERT INTO parameter(parameterid,parametername) VALUES('TESTRESULT','Test Result');
COMMIT;

Примечание 1:
Я пропустил разрывы строк для заголовков имен параметров «Test *». Это кажется неуместным.

Примечание 2:
Мой MCVE содержит значения, соответствующие желаемому результату, не всегда совпадающие с образцом ввода. Если значения взяты из входных данных выборки, выходные данные выглядят иначе - и более убедительно. Неважно, какая сторона несоответствия верна, а какая опечатка. Я решил реализовать версию, которая требует большей гибкости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...