【问题标题】:SQL query how to use two date variables? Both 'date' and regexp_replace('date', '-', ''),1,8)SQL查询如何使用两个日期变量? 'date' 和 regexp_replace('date', '-', ''),1,8)
【发布时间】:2019-11-07 07:46:09
【问题描述】:

SQL查询是python文件的部分代码,tt1的val和tt2的val在单个文件中都可以正常工作,现在我想计算tt1.val/tt2.val,我必须输入参数codestart_dateend_date

the date from table_name_a is '20191107'

the date from table_name_b is '2019-11-07 00:00:00'

这就是我在table_name_b 中使用substr(regexp_replace(date,'-',''),1,8) 的原因,我将错误的SQL 查询粘贴如下,我可以使用case whenif else 来使用两个不同的日期变量吗?非常感谢您的任何建议。

SELECT code, tt1.val/tt2.val
FROM (

    (
    SELECT code,
        CAST (exp(sum(ln(val+1))) -1 AS decimal(20,16)) val
    FROM (
        SELECT code, val
        from table_name_a
        WHERE code IN ('%(code)s')
        AND date BETWEEN '%(start_date)s' AND '%(end_date)s')
    GROUP BY code
    ) AS tt1
    (
    SELECT code,
        CAST (exp(sum(ln(val+1))) -1 AS decimal(20,16)) val
    FROM (
        SELECT code, val
        from table_name_b
        WHERE code IN ('%(code)s')
        AND substr(regexp_replace(date,'-',''),1,8) BETWEEN '%(start_date)s' AND '%(end_date)s' AS t1
    GROUP BY code
    ) AS tt1
) AS tt3

【问题讨论】:

  • 我在这里看不到实际的问题陈述,只是一堆代码。请让我们知道这个大型 SQL 查询中实际问题出在哪里。
  • 两个表中日期列的数据类型是什么?是table_name_b 中的日期数据类型和table_name_a 中的数字数据类型吗?
  • @Tejash table_name_a 的日期是'20191107',table_name_b 的日期是'2019-11-07 00:00:00',这就是我使用 substr(regexp_replace(date,' -',''),1,8) in table_name_b
  • 你能提供desc table_name_b的输出吗?和desc table_name_a?
  • 不幸的是,您已经将代码编辑到了无稽之谈的地步:此查询无法在 Oracle 数据库上编译。您需要提供完全有效的测试用例或对您正在尝试做的事情的清晰解释。所以请给我们表格结构、样本数据、示例参数值以及从起始数据和参数派生的所需输出。您不必向我们提供您的实际表格:仅包含查询引用的列的简化结构。

标签: python sql oracle


【解决方案1】:

我认为您只需 JOIN 您的查询:

SELECT tt1.code, tt1.val/tt2.val
FROM (SELECT code
           , CAST (exp(sum(ln(val+1))) -1 AS decimal(20,16)) val
        FROM table_name_a
       WHERE code IN ('%(code)s')
         AND date BETWEEN '%(start_date)s' AND '%(end_date)s'
       GROUP BY code) tt1
JOIN (SELECT code
           , CAST (exp(sum(ln(val+1))) -1 AS decimal(20,16)) val
        FROM table_name_b
       WHERE code IN ('%(code)s')
         AND substr(regexp_replace(date,'-',''),1,8) BETWEEN '%(start_date)s' AND '%(end_date)s'
       GROUP BY code) tt2
  ON tt2.code = tt1.code

还稍微简化了您的查询。

【讨论】:

  • 您好,感谢您的回答,这似乎也是一个错误的 SQL 查询,因为我收到了一个错误 AnalysisException: Syntax error in line 13: ) AS tt1 ^ Encountered: AS Expected: LIMIT, ORDER, UNION CAUSED BY: Exception: Syntax error
  • 已编辑查询并删除了 AS 关键字,因为只能在列别名中使用,而不能在表别名中使用...
  • 嘿,再次感谢,我不确定我们是否可以使用这样的 SQL 查询,现在我得到AnalysisException: Syntax error in line 13: ) tt1 ^ Encountered: IDENTIFIER Expected: LIMIT, ORDER, UNION CAUSED BY: Exception: Syntax error unable to rollback
  • @Elsa - IDENTIFIER 似乎是您在查询中引入的东西。如果不查看您正在执行的实际代码,我们就无法诊断您的语法错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
  • 2020-04-11
  • 1970-01-01
相关资源
最近更新 更多