在SQLIte中的PIVOT

时间:2011-09-14 12:43:59

标签: sqlite

我想得到一个表格,显示他们在一个查询中为所有参数值接收的参数和值。

这是我的表结构:

tbl_parameter

参数标识 parametername

tbl_parametervalues

参数标识 parametervalue

tbl_parameter中的实际结构

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

tbl_parametervalues中的实际结构

  ------------------------------------
  | 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 个答案:

答案 0 :(得分:1)

我找不到如何检测参数值集的定义,即" TEMP"属于" TYPE"。所以我假设参数值集总是连续地按照问题中给出的顺序输入到数据库中。 OP的评论似乎允许这种假设。对于改组后的命令(通过绕参数关联进行关联)来实现一些鲁棒性并不是很复杂(尽管有点),但我希望没有必要。

我也找不到什么" SL NO"意味着价值来自哪里。所以我通过将TESTRESULT值的rowid除以7(不同参数名称的数量,我认为是参数集的大小)来伪造它。从数据库中挖掘正确的值应该不难。只要连续输入参数,就不需要rowid在7的倍数上。只是" SL NO"可能会跳过一些数字,如果是例如" TYPE"是例如的倍数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
 ;
  • 为每个枢轴列动态制作一个表
  • 从每个表中选择一列的条目
  • 通过rowid上的假设(如上所述)关联同一行的条目

输出:

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:
我跳过了"测试*"标题的换行符。参数名称。这似乎无关紧要。

注2:
我的MCVE包含与所需输出匹配的值,并不总是与样本输入相同。如果值来自样本输入,则输出看起来不同 - 并且更有说服力。不一致的哪一方是正确的,哪个是错字,这一点并不重要。我选择实现需要更多灵活性的版本。