首页 > 解决方案 > SQL | 将商店现金与银行现金匹配

问题描述

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

我们在现金管理方面存在与价值相匹配的问题。

我有两个 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到(+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

PS对于这个项目将使用谷歌大查询。

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

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)

标签: sqljoingoogle-bigquerydatacash

解决方案


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

您尚未提供任何示例数据,因此我无法对其进行测试,但这可能会奏效。由于不确定日期格式,可能需要进行一些修改。让我知道是否有问题。

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

推荐阅读