【问题标题】:Combining two SQL Queries and their results组合两个 SQL 查询及其结果
【发布时间】:2020-07-01 13:24:05
【问题描述】:

我正在使用 Oracle 数据库,并且我使用以下连接编写了一个 SQL 查询:

SELECT
(CT.CRDATTIM || CT.RECORDCD || CT.CRNODE) AS CALLERKEY 
FROM
   W67U999S F 
   JOIN
      W03U999S CT 
      ON F.CCRDATTIM = CT.CRDATTIM 
      AND F.CRECORDCD = CT.RECORDCD 
      AND F.CCRNODE = CT.CRNODE 
      AND F.CRECORDCD = 'T' 
      AND CT.WRKTYPE = 'CALLER' 
   JOIN
      PQCUSTSRV CDT 
      ON F.CCRDATTIM = CDT.CRDATTIM 
      AND F.CRECORDCD = CDT.RECORDCD 
      AND F.CCRNODE = CDT.CRNODE 
WHERE
   F.PCRDATTIM = '2019-01-29-06.10.33.037940' 
   AND F.PRECORDCD = 'F' 
   AND F.PCRNODE = '01' 
   AND CT.CRDATTIM < '9999-12-31-23.59.59.999999'

上面的查询返回了以下几行数据:

CALLERKEY
----------
2019-01-29-06.10.33.310940T01
2019-03-26-00.51.05.124040T01
2019-03-26-00.51.07.993040T01
2019-03-26-00.51.35.531040T01
2019-04-02-04.02.42.280040T01

现在我想使用以下 SQL 查询来查询每一行,以获取一些我感兴趣的附加数据: 示例如下:

SELECT COUNT(*) AS TESTCOUNT FROM PQCUSTSRV where CALLERKEY='2019-01-29-06.10.33.310940T01' AND TO_TIMESTAMP(CRDATTIM,'YYYY-MM-DD HH24.MI.SS.FF') 
      BETWEEN ADD_MONTHS(SYSTIMESTAMP,-12) AND SYSTIMESTAMP  
  

以上查询返回如下数据:

TESTCOUNT
------------
2

现在我想结合以上两个查询,得到如下输出:

CALLERKEY                           TESTCOUNT                                               
----------                          --------    
2019-01-29-06.10.33.310940T01       2
2019-03-26-00.51.05.124040T01       3       
2019-03-26-00.51.07.993040T01       2
2019-03-26-00.51.35.531040T01       1
2019-04-02-04.02.42.280040T01       4

我怎样才能做到这一点?如果您需要任何其他信息,请告诉我。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:
    with t as (
          <first query here>
         )
    select t.callerkey, count(p.callerkey) AS TESTCOUNT
    from t left join
         PQCUSTSRV p
         on p.callerkey = t.callerkey and
            to_timestamp(p.CRDATTIM, 'YYYY-MM-DD HH24.MI.SS.FF') >= add_months(SYSTIMESTAMP, -12) 
    group by t.callerkey;
    

    我将日期比较的逻辑更改为只使用&gt;=,假设您在crdattim 中没有未来值。

    【讨论】:

    • 对不起..我收到错误ORA-00904: "T"."CALLERKEY": invalid identifier
    • 我很想知道您的回答有什么问题。您能否更正一下,以便我今天可以学到新东西?无论如何,为您的方法和快速响应 +1。
    • @Ashok.N 。 . .我省略了join
    • 是的,使用右连接会得到我想要的。非常感谢。
    【解决方案2】:

    你可以使用group by如下:

    Select F.CALLERKEY, COUNT(1) AS CNT
      From (your_first_query) f
      Left Join PQCUSTSRV s
        On s.CALLERKEY=f.CALLERKEY AND TO_TIMESTAMP(CRDATTIM,'YYYY-MM-DD HH24.MI.SS.FF') 
          BETWEEN ADD_MONTHS(SYSTIMESTAMP,-12) AND SYSTIMESTAMP  
     Group by f.callerkey
    

    【讨论】:

    • 但不知何故,结果的数量是错误的。不知道查询中的什么逻辑导致了这种情况。
    • 我应该得到五行,如问题所示,但只得到三行。这可能是什么原因?
    • 好的。那么你需要左加入。查看更新的答案
    【解决方案3】:

    未经测试,但这应该可以工作

    SELECT A.CALLERKEY, COUNT(*) AS TESTCOUNT 
    (SELECT (CT.CRDATTIM || CT.RECORDCD || CT.CRNODE) AS CALLERKEY
       FROM W67U999S F
            JOIN W03U999S CT
               ON     F.CCRDATTIM = CT.CRDATTIM
                  AND F.CRECORDCD = CT.RECORDCD
                  AND F.CCRNODE = CT.CRNODE
                  AND F.CRECORDCD = 'T'
                  AND CT.WRKTYPE = 'CALLER'
            JOIN PQCUSTSRV CDT
               ON     F.CCRDATTIM = CDT.CRDATTIM
                  AND F.CRECORDCD = CDT.RECORDCD
                  AND F.CCRNODE = CDT.CRNODE
      WHERE     F.PCRDATTIM = '2019-01-29-06.10.33.037940'
            AND F.PRECORDCD = 'F'
            AND F.PCRNODE = '01'
            AND CT.CRDATTIM < '9999-12-31-23.59.59.999999')A, PQCUSTSRV B
     WHERE A.CALLERKEY=B.CALLERKEY AND TO_TIMESTAMP(CRDATTIM,'YYYY-MM-DD HH24.MI.SS.FF')
          BETWEEN ADD_MONTHS(SYSTIMESTAMP,-12) AND SYSTIMESTAMP
     GROUP BY B.CALLERKEY
    

    【讨论】:

      猜你喜欢
      • 2021-07-02
      • 1970-01-01
      • 2016-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多