2013-03-06 61 views
0

我有一个联合查询,它从两个不同请求中检索信息,并将它们进行比较,并根据第三行中的比较显示YES,NO,NA。限制联合查询中的列

下面是我的SQL查询

SELECT CAST(RR.reqestno AS VARCHAR(MAX)) reqestno, 
CAST(RR.receiveddate AS VARCHAR(MAX)) AS receiveddate, 
CAST(RR.rptcomments AS VARCHAR(MAX)) AS rptcomments, 
CAST(RR.reportfrequency AS VARCHAR(MAX)) AS reportfrequency, 
CAST(RR.schedule AS VARCHAR(MAX)) AS schedule, 
CAST(RR.schedulebasedon AS VARCHAR(MAX)) AS schedulebasedon, 
CAST(RR.clmsrvdtfrom AS VARCHAR(MAX)) AS clmsrvdtfrom, 
CAST(RR.clmsrvdtthru AS VARCHAR(MAX)) AS clmsrvdtthru, 
CAST(RR.clmpddtfrom AS VARCHAR(MAX)) AS clmpddtfrom, 
CAST(RR.clmpddtthru AS VARCHAR(MAX)) AS clmpddtthru, 
CAST(RR.customer AS VARCHAR(MAX)) AS customer 
from REPORT_REQUEST RR 
where RR.reqestno = xxxxxx 
UNION ALL 
SELECT CAST(RR.reqestno AS VARCHAR(MAX)) reqestno, 
CAST(RR.receiveddate AS VARCHAR(MAX)) AS receiveddate, 
CAST(RR.rptcomments AS VARCHAR(MAX)) AS rptcomments, 
CAST(RR.reportfrequency AS VARCHAR(MAX)) AS reportfrequency, 
CAST(RR.schedule AS VARCHAR(MAX)) AS schedule, 
CAST(RR.schedulebasedon AS VARCHAR(MAX)) AS schedulebasedon, 
CAST(RR.clmsrvdtfrom AS VARCHAR(MAX)) AS clmsrvdtfrom, 
CAST(RR.clmsrvdtthru AS VARCHAR(MAX)) AS clmsrvdtthru, 
CAST(RR.clmpddtfrom AS VARCHAR(MAX)) AS clmpddtfrom, 
CAST(RR.clmpddtthru AS VARCHAR(MAX)) AS clmpddtthru, 
CAST(RR.customer AS VARCHAR(MAX)) AS customer 
from REPORT_REQUEST RR 
where RR.reqestno = yyyyyy 
UNION ALL 
SELECT 
     CASE WHEN A.reqestno = B.reqestno THEN 'Yes' ELSE 'No' END as reqestno, 
     CASE WHEN A.receiveddate = B.receiveddate THEN 'Yes' ELSE 'No' END as receiveddate, 
     CASE WHEN A.rptcomments is null and B.rptcomments is null then 'NA' WHEN A.rptcomments = B.rptcomments THEN 'Yes' ELSE 'No' END rptcomments, 
     CASE WHEN A.reportfrequency = B.reportfrequency THEN 'Yes' ELSE 'No' END as reportfrequency, 
     CASE WHEN A.schedule = 'NONE' and B.schedule = 'NONE' THEN 'NA'WHEN A.schedule = B.schedule THEN 'Yes' ELSE 'No' END as schedule, 
     CASE WHEN A.schedulebasedon = 'NONE' and B.schedulebasedon = 'NONE' THEN 'NA' WHEN A.schedulebasedon = B.schedulebasedon THEN 'Yes' ELSE 'No' END as schedulebasedon, 
     CASE WHEN A.clmsrvdtfrom is null and B.clmsrvdtfrom is Null Then 'NA' WHEN A.clmsrvdtfrom = B.clmsrvdtfrom THEN 'Yes' ELSE 'No' END as clmsrvdtfrom, 
     CASE WHEN A.clmsrvdtthru is null and B.clmsrvdtthru is null then 'NA' WHEN A.clmsrvdtthru = B.clmsrvdtthru THEN 'Yes' ELSE 'No' END as clmsrvdtthru, 
     CASE WHEN A.clmpddtfrom is Null and B.clmpddtfrom is null then 'NA' WHEN A.clmpddtfrom = B.clmpddtfrom THEN 'Yes' ELSE 'No' END as clmpddtfrom, 
     CASE WHEN A.clmpddtthru is null and B.clmpddtthru is null then 'NA' WHEN A.clmpddtthru = B.clmpddtthru THEN 'Yes' ELSE 'No' END as clmpddtthru, 
     CASE WHEN A.customer = B.customer THEN 'Yes' ELSE 'No' END as customer 

FROM 
      (SELECT reqestno,receiveddate,rptcomments,reportfrequency,schedule,schedulebasedon,clmsrvdtfrom, 
clmsrvdtthru,clmpddtfrom,clmpddtthru,customer FROM REPORT_REQUEST WHERE reqestno = xxxxxx) AS A 
INNER JOIN 
       (SELECT reqestno,receiveddate,rptcomments,reportfrequency,schedule,schedulebasedon,clmsrvdtfrom, 
clmsrvdtthru,clmpddtfrom,clmpddtthru,customer FROM REPORT_REQUEST WHERE reqestno = yyyyyy) AS B 
     ON 1 = 1 

问题 我应该如何修改上面的查询,使之仅显示比较后有排在第三只“NO”的值列前两行并以某种方式隐藏其他列,比较返回YES或NA。我希望看到所有3行(2行数据+ 1行compariosn)

需要帮助请 感谢advan ce

+2

你为什么要把所有东西都转换成varchar(max)?必须有这样的事情需要做,但我不明白为什么?我会想象这个查询永远运行! – 2013-03-06 00:32:56

+0

您应该提供一个根本简化您的查询,样本数据和所需的输出,以及为什么/如何从数据中获得输出的正确解释。实际上,您的SQL非常庞大,以至于读者反思并转向另一个问题。 – 2013-03-06 01:19:59

回答

0

基本上,您将UNION查询放入子查询并限制该查询。我不打算复制你的怪物查询 - 请SSCCE读了(Short, Self-Contained, Correct Example) - 但是:

SELECT r.* 
    FROM (SELECT Value1, Value2 
      FROM SomeWhere 
      WHERE SomeColumn = 234 
     UNION 
     SELECT Value1, Value2 
      FROM ElseWhere 
      WHERE ElseColumn = 432 
     ) AS r 
    WHERE Value1 > 37 OR Value2 < 91 

您可能还需要做OLAP代码的东西;你提到'第三行'是有问题的--SQL是一个基于集合的语言,排序并不自然(但可以完成)。

+0

我不想限制基于值的记录,但woukld喜欢限制基于值返回的列。用你的逻辑我是gettig结果,我希望 – 2013-03-06 14:40:03

+0

你想重写返回列的数量取决于你找到什么,或作为参数传递给查询的值?如果是这样,除非您使用动态SQL来编写具有所需列数的查询,否则将会遇到困难。查询必须是可描述的;描述查询的一个方面是将要返回的列数。您不能让数据修改返回的列数。您可以返回固定数量的列,其中一些列需要被忽略。 – 2013-03-06 14:42:47

+0

谢谢你。我试图修改返回的列数。无论如何谢谢你帮助我 – 2013-03-06 19:11:27

0

您可能希望将INNER JOINON表达式更改为and连接的“否”条件。

+0

什么是where条件,它将限制返回“YES”的列。如果我们可以在那里有限制,那么这将是理想的。 – 2013-03-06 19:13:59

+0

您正在加入有效产生笛卡尔联接的“1-1”。相反,我建议查看你的'CASE'语句,隔离所需的条件以产生“** NO **”,并用'和'连接它们。这会限制你的'INNER JOIN'。它会产生更少的行(不是列)。 - 如果我误解了您的要求,请忽略我的回答。 – 2013-03-06 19:23:02