【发布时间】:2019-03-31 03:03:33
【问题描述】:
! - 我不是在寻找可以完成这项工作的付费软件(因为太贵了)
我们在现金管理方面遇到了问题,以匹配价值。
我有两个 SQL 表,我们称之为 SHOP_CASH 和 BANK_CASH
1) 应根据 ShopName-CashAmount-Date 进行匹配。
2) 这里我遇到了两个问题
现金应该四舍五入到最接近的 50 英镑,理想情况下,12 400 和 12 499 应该四舍五入到 12 450,或者这只是 IDEAL 是基于现金差额的匹配小于 50,干匹配不同的值,如果差异小于 50,匹配它们,但这里是如何匹配值的问题.. 这只是愚蠢的想法))???嗯……卡住了。
日期,店铺几天后可以提现,所以需要根据提现日期(例如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