如何将"get DATA for DATE + 1" 翻译成sql 查询(可选的oracle 过程解决方案)

How to translate "get DATA for DATE + 1" into sql query (optional oracle procedure solution)

你好,我好像找不到解决这个问题的方法

我有这个问题

(注意:日期和所有列的数据类型都使用VARCHAR)

SELECT tableA.CODE,tableA.CREDIT, Q1, Q2, Q3, CountedStock, SystemStock
FROM
    (
    select table1.CODE as CODE, table1.credit as CREDIT, Q1, Q2, Q3, Q1 + Q2 - Q3 CountedStock
    from
       (select stockurp.code as CODE, stockurp.credit, stockurp.quantity as Q1, reportenableurp.qty as Q2
       from stockurp join reportenableurp 
       on stockurp.code = reportenableurp.code and stockurp.credit = reportenableurp.credit 
   //  where stockurp.date = '20151001' and reportenableurp.date = '2015-10-01')   
       table1
       join
       (select accountid, credit, count (recharge.credit) as Q3
       from recharge
       group by accountid, credit) table2
       ON table1.CODE=table2.accountid
       AND table1.credit=table2.credit
    )tableA
JOIN
    (
    select stockurp.code as KODE, stockurp.credit as KREDIT, stockurp.quantity as SystemStock
    from stockurp
 // where stockurp.date = '20151002' )  
    tableB
on CODE=KODE and CREDIT=KREDIT
where CountedStock <> SystemStock

主要关注这些行

where stockurp.date = '20151001' and reportenableurp.date = '2015-10-01')

where stockurp.date = '20151002'

整个查询的重点是比较CountedStock和SystemStock的数量。要获得 CountedStock,我必须使用查询来计算 N 日期的股票。得到CountedStock后,我想将它与SystemStock进行比较,后者是N+1日期的股票。

如果CountedStock和SystemStock不匹配,那就是问题,这就是我想找的,但这与这里的问题无关。

问题是,我想获取每个日期的结果。当前查询只给出 1 个日期的结果,我必须自己指定它 (20151001)。

让我卡住的是 SystemStock 日期,因为如果我想获得每个日期的结果,那么我必须写类似

的东西
where stockurp.date = stockurp.date+1 

这在 sql 中显然没有意义,我似乎无法将该算法转换为 sql 查询。

甚至可以在 sql 查询中这样做吗?我将非常感谢你的帮助。哦,有人建议我应该使用程序(我正在使用 Toad for Oracle),但我不知道如何使用。

所以如果你有想法为此做一个oracle程序,请告诉。提前谢谢大家。

因为您将日期存储为字符串(您永远不应该这样做;this is about storing as numbers,但同样适用),您需要将字符串从一种格式转换为另一种格式以进行比较,在第二种情况下还要加一天。这意味着将字符串弹跳到实际日期并返回到字符串;在第一个嵌套连接中,它看起来像:

reportenableurp.date = to_char(to_date(stockurp.date, 'YYYYMMDD'), 'YYYY-MM-DD')

'date' 当然不是有效的列名,但我将比较的左侧保留为字符串,并将右侧转换两次以防 'date' 列是索引(如果将其存储为实际日期也会更好)。您也可以将双方都转换为日期进行比较。

从每个内部视图中提取日期可以让您将它们作为连接条件进行比较;最小的变化:

SELECT CountedDate, SystemDate, CODE, CREDIT, Q1, Q2, Q3, CountedStock, SystemStock
FROM
    (
    select table1.dat as CountedDate, table1.CODE as CODE, table1.credit as CREDIT, Q1, Q2, Q3, Q1 + Q2 - Q3 CountedStock
    from
       (select stockurp.dat, stockurp.code as CODE, stockurp.credit, stockurp.quantity as Q1, reportenableurp.qty as Q2
       from stockurp join reportenableurp 
       on stockurp.code = reportenableurp.code and stockurp.credit = reportenableurp.credit 
       and reportenableurp.dat = to_char(to_date(stockurp.dat, 'YYYYMMDD'), 'YYYY-MM-DD')
       )   
       table1
       join
       (select accountid, credit, count (recharge.credit) as Q3
       from recharge
       group by accountid, credit) table2
       ON table1.CODE=table2.accountid
       AND table1.credit=table2.credit
    ) tableA
JOIN
    (
    select stockurp.dat as SystemDate, stockurp.code as KODE, stockurp.credit as KREDIT, stockurp.quantity as SystemStock
    from stockurp ) tableB
on CODE=KODE and CREDIT=KREDIT
and SystemDate = to_char(to_date(CountedDate, 'YYYYMMDD') + 1, 'YYYYMMDD')
where CountedStock <> SystemStock;

除非我遗漏了什么,否则我可能会用更简单的连接替换内联视图:

SELECT stock_1.dat as CountedDate, stock_2.dat as SystemDate, stock_1.code,
  stock_1.credit, stock_1.quantity as Q1, report.qty as Q2, count(recharge.credit) as Q3,
  stock_1.quantity + report.qty - count(recharge.credit) as CountedStock,
  stock_2.quantity as SystemStock
FROM stockurp stock_1
JOIN reportenableurp report
ON report.code = stock_1.code
AND report.credit = stock_1.credit
AND report.dat = to_char(to_date(stock_1.dat, 'YYYYMMDD'), 'YYYY-MM-DD')
JOIN recharge
ON recharge.accountid = stock_1.code
AND recharge.credit = stock_1.credit
JOIN stockurp stock_2
ON stock_2.code = stock_1.code
AND stock_2.credit = stock_1.credit
AND stock_2.dat = to_char(to_date(stock_1.dat, 'YYYYMMDD') + 1, 'YYYYMMDD')
GROUP BY stock_1.dat, stock_2.dat, stock_1.code, stock_1.credit, stock_1.quantity,
  report.qty, stock_2.quantity
HAVING stock_1.quantity + report.qty - count(recharge.credit) <> stock_2.quantity;

Quick SQL Fiddle demo.

当然,这是假设您的所有 'date' 字符串实际上都可以成功转换为实际日期,并且您没有任何损坏的数据。