SQL查询-消除过程

SQL查询-消除过程,sql,Sql,我有3个查询,我需要把它们放在一个单一的查询和一个单一的输出中,但似乎无法得到我需要的最终结果。如有任何建议,将不胜感激 SampleID | TestID | Microcomments |ProductID |ComapanyID ---------+--------+----------------+----------+---------- 111101 | Test1 | Satisfactory | ABC123 | 1111 111101 | Test2 |

我有3个查询,我需要把它们放在一个单一的查询和一个单一的输出中,但似乎无法得到我需要的最终结果。如有任何建议,将不胜感激

SampleID | TestID | Microcomments  |ProductID |ComapanyID
---------+--------+----------------+----------+----------
 111101  | Test1  | Satisfactory   | ABC123   | 1111
 111101  | Test2  | No Test        | ABC123   | 1111
 111101  | Test3  | Unsatisfactory | ABC123   | 1111
 222202  | Test2  | Satisfactory   | A21      | 2222
 222202  | Test3  | Unsatisfactory | A21      | 2222
 333301  | Test1  | Satisfactory   | AB11     | 3333
 333301  | Test3  | No Test        | AB11     | 3333
 444403  | Test2  | Unsatisfactory | ABCD123  | 4444
 444403  | Test3  | No Test        | ABCD123  | 4444
 555504  | Test1  | Unsatisfactory | BA123    | 5555
 555504  | Test2  | Unsatisfactory | BA123    | 5555
 666601  | Test3  | Satisfactory   | BBB21    | 6666
 666601  | Test2  | Satisfactory   | BBB21    | 6666
问题1

Select distinct sample ID 
where Microcomment = 'Unsatisfactory'
问题2

Select Distinct Sample ID 
where Microcomment = 'Satisfactory' 
  and (only display sampleID’s that don't appear in the Query 1)
问题3

Select Distinct Sample ID 
where Microcomment = 'No Test' 
  and (only display sampleID’s that don't appear in the Query 1 & 2)
我试图实现的最终输出

SampleID | Microcomments   | ProductID
---------+-----------------+----------
 111101  | Unsatisfactory  | ABC123
 222202  | Unsatisfactory  | A21
 333301  | Satisfactory    | AB11
 444403  | Unsatisfactory  | ABCD123
 555504  | Unsatisfactory  | BA123
 666601  | Satisfactory    | BBB21

请注意,这不是实际的数据

我想你让它变得比需要的更困难了

再次编辑 试试下面这些:

-最终输出: 选择SampleID、MAXMicrocomments、ProductID 从桌子上 按样本ID、ProductID分组
只要它有不满意的、令人满意的、没有测试值,即按字母顺序排列,并且这个顺序是您希望为样本显示它们的顺序…

我认为您使它变得比需要的更困难

再次编辑 试试下面这些:

-最终输出: 选择SampleID、MAXMicrocomments、ProductID 从桌子上 按样本ID、ProductID分组 只要它有不满意、满意、没有测试值,即按字母顺序排列,并且此顺序是您希望为样本ID显示它们的顺序…

更新

好的,现在我更好地理解了您想要实现的目标,我已经修改了查询

关键是将三个不同的结果集合并在一起。每个集合都是通过使用NOT IN子句排除其他相关集合而创建的

SELECT DISTINCT(t1.SampleID), t1.Microcomments, t1.ProductID
FROM t_table t1
WHERE t1.Microcomments = 'Unsatisfactory'
UNION
SELECT DISTINCT(t2.SampleID), t2.Microcomments, t2.ProductID
FROM t_table t2
WHERE t2.Microcomments = 'Satisfactory' AND t2.SampleID NOT IN (SELECT SampleID from t_table WHERE Microcomments = 'Unsatisfactory')
UNION
SELECT DISTINCT(t3.SampleID), t3.Microcomments, t3.ProductID
FROM t_table t3
WHERE t3.Microcomments = 'No Test' AND t3.SampleID NOT IN (SELECT SampleID from t_table WHERE Microcomments IN('Satisfactory','Unsatisfactory'))
ORDER BY SampleID ASC;
我在这里创建了一个sql小提琴:

让我知道,如果这是你要找的

-原创的-

可以使用WHERE子句中的OR语句将要搜索的所有条件组合到一个查询中。除非数据比您显示的更复杂,否则这将对您有效

SELECT DISTINCT SampleID, Microcomments, ProductID
FROM table_name 
WHERE Microcomments = ‘Satisfactory’ OR Microcomments = ‘Satisfactory’ OR Microcomments = ‘No Test’ 
ORDER BY Microcomments
更新

好的,现在我更好地理解了您想要实现的目标,我已经修改了查询

关键是将三个不同的结果集合并在一起。每个集合都是通过使用NOT IN子句排除其他相关集合而创建的

SELECT DISTINCT(t1.SampleID), t1.Microcomments, t1.ProductID
FROM t_table t1
WHERE t1.Microcomments = 'Unsatisfactory'
UNION
SELECT DISTINCT(t2.SampleID), t2.Microcomments, t2.ProductID
FROM t_table t2
WHERE t2.Microcomments = 'Satisfactory' AND t2.SampleID NOT IN (SELECT SampleID from t_table WHERE Microcomments = 'Unsatisfactory')
UNION
SELECT DISTINCT(t3.SampleID), t3.Microcomments, t3.ProductID
FROM t_table t3
WHERE t3.Microcomments = 'No Test' AND t3.SampleID NOT IN (SELECT SampleID from t_table WHERE Microcomments IN('Satisfactory','Unsatisfactory'))
ORDER BY SampleID ASC;
我在这里创建了一个sql小提琴:

让我知道,如果这是你要找的

-原创的-

可以使用WHERE子句中的OR语句将要搜索的所有条件组合到一个查询中。除非数据比您显示的更复杂,否则这将对您有效

SELECT DISTINCT SampleID, Microcomments, ProductID
FROM table_name 
WHERE Microcomments = ‘Satisfactory’ OR Microcomments = ‘Satisfactory’ OR Microcomments = ‘No Test’ 
ORDER BY Microcomments

如果您的DBMS支持,那么我认为最简单的方法是使用微命令对每个样本中的行进行排序:

SELECT  SampleID, TestID, MicroComments, ProductID, CompanyID
FROM    (   SELECT  SampleID,
                    TestID,
                    MicroComments,
                    ProductID,
                    CompanyID,
                    ROW_NUMBER() OVER(PARTITION BY SampleID 
                                        ORDER BY CASE WHEN MicroComments = 'UnSatisfactory' THEN 1
                                                        WHEN MicroComments = 'Satisfactory' THEN 2
                                                        WHEN MicroComments = 'No test' THEN 3
                                                    END) AS RowNum
            FROM    T
        ) T
WHERE   RowNum = 1;
如果您的DBMS不支持它,或者即使它支持,您也可以使用条件聚合得到它。这是基于以下假设,即对于每个样本ID,ProductID和CompanyID都是常量:

SELECT  SampleID, ProductID, CompanyID,
        CASE WHEN COUNT(CASE WHEN MicroComments = 'UnSatisfactory' THEN 1 END) > 0 THEN 'UnSatisfactory'
            WHEN COUNT(CASE WHEN MicroComments = 'Satisfactory' THEN 1 END) > 0 THEN 'Satisfactory'
            WHEN COUNT(CASE WHEN MicroComments = 'No test' THEN 1 END) > 0 THEN 'No test'
        END AS MicroComments
FROM    T
GROUP BY SampleID, ProductID, CompanyID;

如果您的DBMS支持,那么我认为最简单的方法是使用微命令对每个样本中的行进行排序:

SELECT  SampleID, TestID, MicroComments, ProductID, CompanyID
FROM    (   SELECT  SampleID,
                    TestID,
                    MicroComments,
                    ProductID,
                    CompanyID,
                    ROW_NUMBER() OVER(PARTITION BY SampleID 
                                        ORDER BY CASE WHEN MicroComments = 'UnSatisfactory' THEN 1
                                                        WHEN MicroComments = 'Satisfactory' THEN 2
                                                        WHEN MicroComments = 'No test' THEN 3
                                                    END) AS RowNum
            FROM    T
        ) T
WHERE   RowNum = 1;
如果您的DBMS不支持它,或者即使它支持,您也可以使用条件聚合得到它。这是基于以下假设,即对于每个样本ID,ProductID和CompanyID都是常量:

SELECT  SampleID, ProductID, CompanyID,
        CASE WHEN COUNT(CASE WHEN MicroComments = 'UnSatisfactory' THEN 1 END) > 0 THEN 'UnSatisfactory'
            WHEN COUNT(CASE WHEN MicroComments = 'Satisfactory' THEN 1 END) > 0 THEN 'Satisfactory'
            WHEN COUNT(CASE WHEN MicroComments = 'No test' THEN 1 END) > 0 THEN 'No test'
        END AS MicroComments
FROM    T
GROUP BY SampleID, ProductID, CompanyID;


示例是否可能有多个微命令?这些都是不错的、非常直接的查询,您应该自己解决,顺便问一下,您使用的是哪种RDBMS?是否为微命令定义了优先级?例如,如果sampleId有不同的微命令,那么最终结果集中应该显示哪个值?您的最终输出来自哪个查询?@i-man-是的,sampleId可以有多个微命令sample可能有多个微命令?这些都是不错的、非常直接的查询,您应该自己解决,顺便问一下,您使用的是哪种RDBMS?是否为微命令定义了优先级?例如,如果sampleId具有不同的微命令,那么最终结果集中应该显示哪个值?您的最终输出来自哪个查询?@i-man-是的,sampleId可以有多个微命令,但在结果集中,微命令可以有“不满意”的值。我的问题是,如何合并查询1、2和3,以消除具有相同样本的结果idbut在resultset Microcomment中可能有“不满意”值我的问题是如何合并查询1 2和3,用相同的样本id删除结果这将返回所有数据,而不删除任何重复的样本id's@KAI,我根据对问题的更好理解更新了回复。更新后的查询也有效。谢谢你花时间和支持!!!抱歉,我无法将其标记为有用的响应,因为我的代表未满15岁。这将返回所有数据,而不会消除任何重复的样本id's@KAI,我根据对问题的更好理解更新了回复。更新后的查询也有效。谢谢你花时间和支持!!!很抱歉,我无法将其标记为有用的响应,因为我的代表年龄在15岁以下。此操作非常有效,非常适合我当前的查询。感谢您的输入和快速支持!!!!这非常有效,很好地符合我当前的查询。感谢您的输入和快速支持!!!!