Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL如何处理子类别_Mysql_Sql - Fatal编程技术网

Mysql SQL如何处理子类别

Mysql SQL如何处理子类别,mysql,sql,Mysql,Sql,这里是新手,希望这不是一个愚蠢的问题。我有一个SQL数据库中的实验室样本表。它包括样本ID、测试名称、子测试名称和结果。我当前的简单SQL查询如下所示: SELECT Sample, Test, Subtest, Result FROM table WHERE Sample = 'list of sample #s' 这将得到以下结果: SAMPLE TEST SUBTEST RESULT XX01 Test1 Test1Sub1 1 XX02 Te

这里是新手,希望这不是一个愚蠢的问题。我有一个SQL数据库中的实验室样本表。它包括样本ID、测试名称、子测试名称和结果。我当前的简单SQL查询如下所示:

SELECT Sample, Test, Subtest, Result
    FROM table
WHERE Sample = 'list of sample #s'  
这将得到以下结果:

SAMPLE  TEST    SUBTEST   RESULT
XX01    Test1   Test1Sub1   1
XX02    Test1   Test1Sub1   2
XX03    Test1   Test1Sub1   3
XX03    Test2   Test2Sub1   4
XX03    Test3   Test3Sub1   5
XX03    Test3   Test3Sub2   6
XX03    Test3   Test3Sub3   7
XX03    Test4   Test4Sub1   8
XX03    Test4   Test4Sub2   9
XX03    Test4   Test4Sub3   10
但是,我正在寻找一个表,该表按唯一的Sample_ID列出,并将子测试列为列。我知道要查找的子测试的名称,因此可以在查询中指定。例如,我希望上面的结果看起来像:

    Test1Sub1   Test2Sub1   Test3Sub1   Test3Sub2   Test3Sub3   Test4Sub1   Test4Sub2   Test4Sub3
XX01    1                           
XX02    2                           
XX03    3           4           5           6           7           8           9           10
有人能帮我处理SQL代码吗?我做了一些调查,但我的知识还不够渊博,还没有具体到找到我想要的答案。谢谢

CREATE TABLE #Test
(SAMPLE VARCHAR(100),  TEST VARCHAR(100),    SUBTEST VARCHAR(100),   RESULT INT)
INSERT INTO #TEST 
VALUES
('XX01','Test1','Test1Sub1',   1   ),
('XX02','Test1','Test1Sub1',   2   ),
('XX03','Test1','Test1Sub1',   3   ),
('XX03','Test2','Test2Sub1',   4   ),
('XX03','Test3','Test3Sub1',   5   ),
('XX03','Test3','Test3Sub2',   6   ),
('XX03','Test3','Test3Sub3',   7   ),
('XX03','Test4','Test4Sub1',   8   ),
('XX03','Test4','Test4Sub2',   9   ),
('XX03','Test4','Test4Sub3',   10 )


SELECT *
FROM 
 (
    SELECT SAMPLE,RESULT,SUBTEST
           FROM  #Test        
) as s
PIVOT
(
    MAX(RESULT)
    FOR SUBTEST IN
(
Test1Sub1,
Test2Sub1,
Test3Sub1,
Test3Sub2,
Test3Sub3,
Test4Sub1,
Test4Sub2,
Test4Sub3
)
)AS pvt


以下是如何使用左连接而不是轴连接

select base.sample, 
       sum(t1s1.result) as Test1Sub1,
       sum(t2s1.result) as Test2Sub1,
       sum(t3s1.result) as Test3Sub1,
       sum(t4s1.result) as Test4Sub1,
       sum(t4s2.result) as Test4Sub2,
       sum(t4s3.result) as Test4Sub3
from (select distinct sample from tablename) as base
left join tablename t1s1 on base.sample = t1s1.sample and t1s1.subtest='Test1Sub1'
left join tablename t2s1 on base.sample = t2s1.sample and t2s1.subtest='Test2Sub1'
left join tablename t3s1 on base.sample = t3s1.sample and t3s1.subtest='Test3Sub1'
left join tablename t4s1 on base.sample = t4s1.sample and t4s1.subtest='Test4Sub1'
left join tablename t4s2 on base.sample = t4s2.sample and t4s2.subtest='Test4Sub2'
left join tablename t4s3 on base.sample = t4s3.sample and t4s3.subtest='Test4Sub3'
group by sample
您可以使用max()而不是sum()--我猜您实际上想要sum


下面是如何使用左连接而不是枢轴来执行此操作

select base.sample, 
       sum(t1s1.result) as Test1Sub1,
       sum(t2s1.result) as Test2Sub1,
       sum(t3s1.result) as Test3Sub1,
       sum(t4s1.result) as Test4Sub1,
       sum(t4s2.result) as Test4Sub2,
       sum(t4s3.result) as Test4Sub3
from (select distinct sample from tablename) as base
left join tablename t1s1 on base.sample = t1s1.sample and t1s1.subtest='Test1Sub1'
left join tablename t2s1 on base.sample = t2s1.sample and t2s1.subtest='Test2Sub1'
left join tablename t3s1 on base.sample = t3s1.sample and t3s1.subtest='Test3Sub1'
left join tablename t4s1 on base.sample = t4s1.sample and t4s1.subtest='Test4Sub1'
left join tablename t4s2 on base.sample = t4s2.sample and t4s2.subtest='Test4Sub2'
left join tablename t4s3 on base.sample = t4s3.sample and t4s3.subtest='Test4Sub3'
group by sample
您可以使用max()而不是sum()--我猜您实际上想要sum


子测试的数量(本例中为8)是否已固定?@koenig26是您的环境SQL Server?@zaggler我不确定删除MySQL标记是否正确。OP用那个数据库给它加了标签。@BlueFoots——发生了什么事——你不再是pivot查询之王了?@BlueFoots他可能给它加了标签
MySQL
,但除了SQL之外,他的问题都没有提到它。。。他只是标记了一个不相关的标记,或者OP感到困惑,不知道
SQL
MySQL
确实不同。我觉得应该删除不相关的标记,因为OP的帖子中根本没有提到它……子测试的数量(本例中为8)是否已修复?@koenig26是您的环境SQL Server?@zaggler我不确定删除MySQL标记是否正确。OP用那个数据库给它加了标签。@BlueFoots——发生了什么事——你不再是pivot查询之王了?@BlueFoots他可能给它加了标签
MySQL
,但除了SQL之外,他的问题都没有提到它。。。他只是标记了一个不相关的标记,或者OP感到困惑,不知道
SQL
MySQL
确实不同。我觉得应该删除不相关的标签,因为OP的帖子中根本没有提到它……MySQL没有pivotfunction@P.Salmon他说SQL数据库,我也这么想。Sorry@P.Salmon仅仅因为他标记了MySQL,并不意味着他正在使用它。如果你读了他的第一段话,没有提到MySQL,那全是SQL;很遗憾地说你错了+1解决方案…@Zaggler我同意@开发者I编辑了OPs问题,删除了不相关的标签以避免混淆。对许多人来说,没有阅读就跳枪。。。IMO请编辑您的答案,包括它所做的事情,因为OP可能不理解您的解决方案,这也有助于其他人发现您的答案有用。MySQL没有pivotfunction@P.Salmon他说SQL数据库,我也这么想。Sorry@P.Salmon仅仅因为他标记了MySQL,并不意味着他正在使用它。如果你读了他的第一段话,没有提到MySQL,那全是SQL;很遗憾地说你错了+1解决方案…@Zaggler我同意@开发者I编辑了OPs问题,删除了不相关的标签以避免混淆。对许多人来说,没有阅读就跳枪。。。IMO请编辑您的答案,以包括它所做的事情,因为OP可能不理解您的解决方案,这也有助于其他人发现您的答案很有用。