【问题标题】:SQL | Match Shop cash with Bank CashSQL |将商店现金与银行现金匹配
【发布时间】:2019-03-31 03:03:33
【问题描述】:

! - 我不是在寻找可以完成这项工作的付费软件(因为太贵了)

我们在现金管理方面遇到了问题,以匹配价值。

我有两个 SQL 表,我们称之为 SHOP_CASHBANK_CASH

1) 应根据 ShopName-CashAmount-Date 进行匹配。

2) 这里我遇到了两个问题

  1. 现金应该四舍五入到最接近的 50 英镑,理想情况下,12 400 和 12 499 应该四舍五入到 12 450,或者这只是 IDEAL 是基于现金差额的匹配小于 50,干匹配不同的值,如果差异小于 50,匹配它们,但这里是如何匹配值的问题.. 这只是愚蠢的想法))???嗯……卡住了。

  2. 日期,店铺几天后可以提现,所以需要根据提现日期(例如2018-10-26)与银行日期RANGE 2018-10-26 to (+7天)2018-11-02

目前,我不明白在这种情况下匹配的可能方式(逻辑)。任何计算/加入的逻辑路径都将不胜感激

试试: 假设我可以通过 SHOPNAME 加入两张桌子 - 酷 然后我会尝试按日期加入,可能是:

SELECT * FROM SHOP_CASH AS SC
LEFT JOIN BANK_CASH AS BC
ON SC.SHOP_NAME_SC = BC.SHOP_NAME_BC
AND SC.DATE_SC = (ANY DATE FROM SC.DATE_SC TO SC.DATE_SC (+7 DAYS) = TO DATE_BC - not sure how)
AND FLOOR(SC.CASH_SC / 50) * 50 = FLOOR(BC_CASH_BC / 50) * 50

P.S.此项目将使用 Google Big Query。

这是我的(临时解决方案)

WITH MAIN AS(SELECT 
CMS.Store_name AS STORE_NAME,
CMS.Date AS SHOP_DATE,
CMB.ENTRY_DATE AS BANK_DATE,
SUM(CMS.Cash) AS STORE_CASH,
SUM(CMB.AMOUNT) AS BANK_CASH
FROM `store_data` CMS
LEFT JOIN `bank_data` AS CMB
ON CMS.store_name = CMB.STRAIGHT_LOOKUP
AND FLOOR(CMS.Cash / 50) * 50 = FLOOR(CMB.AMOUNT / 50) * 50
AND CAST(FORMAT_DATE("%F",CMB.ENTRY_DATE) AS STRING) > CAST(FORMAT_DATE("%F",CMS.Date) AS STRING)
AND CAST(FORMAT_DATE("%F",CMB.ENTRY_DATE) AS STRING) <= CAST(FORMAT_DATE("%F",DATE_ADD(CMS.Date, INTERVAL 4 day)) AS STRING)
GROUP BY STORE_NAME,SHOP_DATE,BANK_DATE)


SELECT 
    MAIN2.*
FROM (
  SELECT
  ARRAY_AGG(MAIN ORDER BY MAIN.SHOP_DATE ASC LIMIT 1)[OFFSET(0)] AS MAIN2
  FROM
    MAIN AS MAIN
    GROUP BY MAIN.SHOP_DATE, MAIN.STORE_CASH)

【问题讨论】:

  • 您的业务流程中遗漏了一些东西!您应该重新审视从商店和银行中捕获的内容。像 orderID 或 ReceiptID 或与您正在进入的模糊逻辑相比更具确定性的东西。当然,具有这三个条件的正式 JOIN 可以很容易地编写 - 那又怎样?!你可以想象——它不会是一对一的,很可能是多对多的匹配。那时你会做什么?不,坏主意!
  • @MikhailBerlyant 这不是讨论问题所在,这是需要找到可行的解决方案的地方。顺便说一句,我找到了更接近我的解决方案的东西。
  • 旨在提醒您注意设计中潜在的严重问题。如果您认为它不适用于您的情况,请忽略。
  • @MikhailBerlyant 我知道这将是多对多的问题,因为我所拥有的都是 shop_name、date 和 cash_amount。如果我有任何类型的唯一 ID,这将不是问题,我不会在这里提出任何问题))

标签: sql join google-bigquery datacash


【解决方案1】:

这是一个非常有趣的案例。

您尚未提供任何示例数据,因此我无法对其进行测试,但这可能有效。由于不确定日期格式,可能需要进行一些修改。如果有问题请告诉我。

SELECT * FROM SHOP_CASH AS SC
LEFT JOIN BANK_CASH AS BC
ON SC.SHOP_NAME_SC = BC.SHOP_NAME_BC
AND  SC.DATE_SC BETWEEN BC.DATE_BC  AND DATE_ADD(BC.DATE_BC, DAY 7)
AND trunc(SC.CASH_SC, -2) + 50  = trunc(BC.CASH_BC,2) + 50

【讨论】:

  • 我必须添加与您的答案类似的内容,但要更新一些。 (抱歉没有提供样本数据)
猜你喜欢
  • 2018-09-26
  • 2013-10-25
  • 1970-01-01
  • 2018-05-10
  • 2019-08-18
  • 1970-01-01
  • 1970-01-01
  • 2020-08-11
  • 2017-10-09
相关资源
最近更新 更多