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