SQLIte中的枢轴

SQLIte中的枢轴,sqlite,Sqlite,我想得到一个表,其中显示了在一个查询中为所有参数值接收的参数和值 这是我的表格结构: tbl_参数 参数化 参数名 tbl_参数值 参数化 参数值 tbl_参数中的实际结构 -------------------------------- ---------------------------------- | parameterid | parametername | |---------------------------- | TYPE | T

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

这是我的表格结构:

tbl_参数 参数化 参数名

tbl_参数值 参数化 参数值

tbl_参数中的实际结构

  --------------------------------
  ----------------------------------
  | parameterid |  parametername    |
  |----------------------------
  |   TYPE      |   Type            |
  |   TEMP      |   Temp(Deg.C)     |
  |   TIME      |   Time            |
  |   DATE      |   Date            |
  |  TECHNICIAN |   Technician      |
  |  TESTLENGTH |   Test Length     |
  |  TESTRESULT |   Test Result     |
  -----------------------------------
tbl_参数值中的实际结构 我希望结果集如下所示:

  -----------------------------------------------------------------------------
  | 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中实现这一点?

我找不到如何检测参数值集的定义,即哪个“TEMP”属于哪个“TYPE”。因此,我假设参数值集总是按照问题中给出的顺序连续输入数据库。OP的评论似乎允许这一假设。实现对无序顺序的健壮性(通过参数绕道关联)不是很复杂(虽然有点复杂),但我希望这不是必要的

我也找不到“SL NO”是什么意思以及该值来自何处的信息。因此,我通过将测试结果值的ROWID除以7(不同参数名的数目,我认为它是参数集的大小)来伪造它。从数据库中挖掘正确的值应该不难。只要参数是连续输入的,就不要求rowid是7的倍数。如果例如“TYPE”的rowid是例如8的倍数,则仅“SL NO”可能会跳过几个数字,否则查询允许参数集之间存在间隙

您可以在这个答案的末尾找到我的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
):

注1:
我跳过了“Test*”参数名称标题的换行符。这似乎无关紧要

注2:

我的MCVE包含与所需输出匹配的值,但并不总是与示例输入相同。如果这些值是从样本输入中获取的,那么输出看起来就不同了,而且更令人信服。不一致的哪一方是正确的,哪一方是打字错误并不重要。我选择实现需要更多灵活性的版本。

在“实际结构”下列出的结构与上面的“表结构”不匹配。此外,parametervalues的“实际结构”看起来不像表结构(列名重复)。它是否实际显示了两行数据?或者列名后面有数字吗?表结构意味着插入到这些表中的样本值(tbl_参数和tbl_参数值)。。列值应在tbl_参数值表中重复。
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
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;