SQL | Матч магазин наличными с банком Cash
! - Я не ищу платное программное обеспечение, которое будет делать эту работу (как слишком дорого)
У нас есть проблема с управлением денежными средствами, чтобы соответствовать значениям.
У меня есть две таблицы SQL, назовем их SHOP_CASH и BANK_CASH
1) Соответствие должно происходить на основе ShopName-CashAmount-Date.
2) Здесь я столкнулся с двумя проблемами
Денежные средства должны быть округлены до ближайших 50 фунтов стерлингов, в идеале, 12 400 и 12 499 должны округляться до 12 450, ИЛИ это просто IDEAL - это совпадение, основанное на разнице денежных средств, которая меньше 50, засыхает, чтобы соответствовать разному значению, если разница равна меньше 50, сопоставьте их, но вот вопрос, как сопоставить значение.. это просто глупые идеи))??? Хммм... застрял.
Даты, магазин может обналичить несколько дней спустя, поэтому необходимо присоединиться на основе даты обналичивания (например, 2018-10-26) с датой банка ДИАПАЗОН 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 Для этого проекта будет использоваться 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)
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