SQl查询在另一个

时间:2017-07-13 14:17:20

标签: mysql sql

我希望下面有足够的信息供您协助

TABA

ComapanyID TrimFields

1111 | 3

2222 | 1

3333 | 2

4444 | 4

5555 | 2

6666 | 3

TABB

SampleID | TestID | Microcomments | ProductID | ComapanyID

111101 | Test1 |满意| ABC123 | 1111

111101 | Test2 |无测试| ABC123 | 1111

111101 | Test3 |不满意| ABC123 | 1111

222202 | Test2 |满意| A21 | 2222

222202 | Test3 |不满意| A21 | 2222

333301 | Test1 |满意| AB11 | 3333

333301 | Test3 |无测试| AB11 | 3333

444403 | Test2 |不满意| ABCD123 | 4444

444403 | Test3 |无测试| ABCD123 | 4444

555504 | Test1 |不满意| BA123 | 5555

555504 | Test2 |不满意| BA123 | 5555

666601 | Test3 |满意| BBB21 | 6666

666601 | Test2 |满意| BBB21 | 6666

目前我的查询是: 声明@num int

设置@companyID = @CompanyID

选择@num = isnull(trimfields,0) 来自TABA,其中companyid = @companyID

选择不同的TABB.SampleID,TABB.MicroComments,
        LTRIM(右(TABB.ProductID,len(rtrim(TABB.productID)) - @num))作为ProductID,

其中TABB.CompanyID = @CompanyID

因此,当我为每个CompanyID(WHERE CLAUSE)运行此查询时,我得到以下结果

SampleID Microcomments ProductID

111101满意123

111101 NoTest 123

111101不满意123

222202满意21
222202不满意21

333301满意11
333301 NoTest 11

444403不满意123
444403 NoTest 123

555504不满意123
555504不满意123

666601满意21
666601满意21

我需要输出以便用下面的逻辑进行总结;

逻辑1-如果样本id相同但是Microcomment具有Satis&不羁& NoTest(EG。公司ID 1111) 然后只显示' Unsatifactory'

逻辑2-如果样本id相同但是Microcomment具有Satis& Unsati(EG.CompanyID 2222) 然后只显示' Unsatifactory'

逻辑3-样本id是相同的但是Microcomment有Satis& NoTest(EG.CompanyID 3333) 然后只显示'满意'

逻辑4-样本id是相同的但是Microcomment有Unsat& NoTest(EG.CompanyID 4444) 然后只显示' Unsatisfactory'

逻辑5-样本id是相同的但是Microcomment只是Unsat(EG.CompanyID 5555) 然后只显示' Unsatisfactory'

逻辑5-样本id是相同的但是Microcomment只是Satis(EG.CompanyID 6666) 然后只显示'不满意'然后只显示'满意'

这样输出就可以了;

SampleID Microcomments ProductID
111101不满意123

222202不满意21

333301满意11

444403不满意123

555504不满意123

666601满意21

我已经尝试过case case,group by,Joins,MIN / MAX ......只是没有运气

1 个答案:

答案 0 :(得分:0)

好的,你添加到你的问题中的额外信息我再试一次:

SELECT DISTINCT TA1.ID, TA1.Name, TA1.Location, TB1.ID, TB1.Results
FROM TableA TA1
  LEFT OUTER JOIN TableB TB1
    ON TB1.ID = TA1.ID
WHERE NOT EXISTS (
    SELECT * 
    FROM TableB TB2
    WHERE TB2.ID = TA1.ID
      AND TB2.Results = 'UNSATISFACTORY')
      OR TB1.Results = 'UNSATISFACTORY';

这应该符合您在问题中陈述的要求。它从TableATableB中选择已加入的信息,使用DISTINCT删除双重项目,以便多个满意或未测试的项目只获得一个结果记录,并过滤掉其他项目以防万一是特定Id的TableB中的UNSATISFACTORY记录。

您还可以在这里查看: http://sqlfiddle.com/#!9/4b202/6

原始答案

我试着根据一些假设来回答你的问题。一个是您的表结构与查询输出相同。另一个是表和列名称。

你可以试试这样的事情

SELECT DISTINCT name, location, yesorno
FROM TestTable T1
WHERE NOT EXISTS (
    SELECT * 
    FROM TestTable T2 
    WHERE T2.name = T1.name 
      AND T2.location = T1.location
      AND T2.yesorno = 'No')
      OR T1.yesorno = 'No';

只有在您的数据中有可能为同一DISTINCTnamelocation提供多条记录时才需要yesorno

请参阅: http://sqlfiddle.com/#!9/546354/7