sql-server - 如果一个值有一个覆盖另一个表,检查几个条件
问题描述
我有 4 个表(带有必要的列):这里
无论这些条件的结果是否已满,我都想生成 0 或 1 的 2 列:
- 如果金额在信用日期之后从(该特定客户的)卖家之一转移。(如果是,则为 1,否则为 0) --column 1
- 如果金额在贷记日期之后从(该特定客户的)卖家的一个组成员中转移。(如果是,则为 1,否则为 0) --column 2
我写了这样的代码:
SELECT distinct
trn.Date_of_Transfer
, trn.CustomerNumber
, trn.CustomerName
, trn.Credit /*Incoming transfer amount*/
, trn.SenderCustomerNumber -- Sender Customer Number
, case when fnd.CustomerNumber is not null then 1 else 0 end as 'IF_Credit_Customer'
, cus.GroupNumber as 'SenderGroupNumber'
, cus2.GroupNumber as 'CustomerGroupNumber' --Main customer, in transaction table
, case when cus.GroupNumber=cus3.GroupNumber and trn.Date_of_Transfer>=fnd.Date_of_Credit then 1 else 0 end as 'IF_Incoming_FromSeller'
FROM trnsac AS trn
LEFT JOIN Funds AS fnd ON trn.CustomerNumber = fnd.CustomerNumber
LEFT JOIN Customers AS cus ON trn.SenderCustomerNumber = cus.CustomerID
LEFT JOIN Customers AS cus2 ON trn.CustomerNumber = cus2.CustomerID
LEFT JOIN Vendors AS ven ON fnd.VendorId = ven.VendorId
LEFT JOIN Customers AS cus3 ON ven.CustomerNumber = cus3.CustomerID
如您所见,我在第 1 列得到了错误的结果(甚至没有弄清楚如何做第 2 列):(
例如,Danny 的第二笔交易是相乘的,而第 1 列的值在两个(相同的)交易中是不同的。它应该是 1,因为 554-Hoogle Glass 不是他的供应商之一(但它与 Danny 的卖家之一属于同一组,第 2 列应标记为“1”)
预期结果如下:
我正在努力:
- 使用 IF_Incoming_FromSeller 获取干净可靠的数据
- 修改代码以获得 IF_Incoming_FromSeller 的结果
任何帮助表示赞赏..
解决方案
好的。这个答案并不完美,但我希望它能让你克服当前的障碍。您需要调整逻辑以适应(此处未涵盖的更广泛评论的一部分)。然而,这是开始。
我的第一步是摆脱那些导致你获得额外行数的东西......我想出了这个。
SELECT
trn.Date_of_Transfer
, trn.CustomerNumber
, trn.CustomerName
, trn.Credit /*Incoming transfer amount*/
, trn.SenderCustomerNumber -- Sender Customer Number
--, case when fnd.CustomerNumber is not null then 1 else 0 end as 'IF_Credit_Customer'
, cus.GroupNumber as 'SenderGroupNumber'
, cus2.GroupNumber as 'CustomerGroupNumber' --Main customer, in transaction table
--, cus3.GroupNumber as 'Vendor_GroupNumber'
--, case when cus.GroupNumber=cus3.GroupNumber and trn.Date_of_Transfer>=fnd.Date_of_Credit then 1 else 0 end as 'IF_Incoming_FromSeller'
FROM trnsac AS trn
--LEFT JOIN Funds AS fnd ON trn.CustomerNumber = fnd.CustomerNumber
LEFT JOIN Customers AS cus ON trn.SenderCustomerNumber = cus.CustomerID
LEFT JOIN Customers AS cus2 ON trn.CustomerNumber = cus2.CustomerID
--LEFT JOIN Vendors AS ven ON fnd.VendorId = ven.VendorId
--LEFT JOIN Customers AS cus3 ON ven.CustomerNumber = cus3.CustomerID
以上为您提供了正确的行数,以及与您的预期值匹配的相关列。
第二步是添加group-by(并删除顶部的'distinct'),然后使用分组来执行逻辑(例如,with MAX(CASE())
)语句。我不是 100% 喜欢这些,但希望它们能被你清理干净。
我还添加了一个新的 LEFT JOIN - 从供应商到同一组中的其他供应商。这使您可以获取最后一列。
这是代码。
SELECT
trn.Date_of_Transfer
, trn.CustomerNumber
, trn.CustomerName
, trn.Credit
, trn.SenderCustomerNumber
, MAX(case when fnd.CustomerNumber is not null then 1 else 0 end) as 'IF_Credit_Customer'
, cus.GroupNumber as 'SenderGroupNumber'
, cus2.GroupNumber as 'CustomerGroupNumber' --Main customer, in transaction table
, MAX(cus3.GroupNumber) as 'Vendor_GroupNumber'
, MAX(case when cus.CustomerId=ven.CustomerNumber AND trn.Date_of_Transfer>=fnd.Date_of_Credit then 1 else 0 end) as 'IF_Incoming_FromSeller'
, MAX(case when cus.CustomerId=cusgrp.CustomerId AND trn.Date_of_Transfer>=fnd.Date_of_Credit then 1 else 0 end) as 'IF_Incoming_FromSellerGroup'
FROM trnsac AS trn
LEFT JOIN Customers AS cus ON trn.SenderCustomerNumber = cus.CustomerID
LEFT JOIN Customers AS cus2 ON trn.CustomerNumber = cus2.CustomerID
LEFT JOIN Funds AS fnd ON trn.CustomerNumber = fnd.CustomerNumber
LEFT JOIN Vendors AS ven ON fnd.VendorId = ven.VendorId
LEFT JOIN Customers AS cus3 ON ven.CustomerNumber = cus3.CustomerID
LEFT JOIN Customers AS cusgrp ON cus3.GroupNumber = cusgrp.GroupNumber
GROUP BY
trn.Date_of_Transfer
, trn.CustomerNumber
, trn.CustomerName
, trn.Credit
, trn.SenderCustomerNumber
, cus.GroupNumber
, cus2.GroupNumber
这是一个带有更新的DB_fiddle 。
笔记
- 由于原始帖子后完成的更新(资金错字),丹尼斯现在有资金。
- 我认为资金和供应商存在逻辑漏洞。如果有人通过一个供应商增加了 500 美元,然后通过另一个供应商增加了 500 美元,你怎么知道哪些人申请了进一步的交易?这可能会对所使用的供应商后续的任何内容提出重大警告。您可以使用运行总计,但这有点超出了这个答案。
- 显然..这希望能给你一个推动。请仔细检查 IF_ 字段的逻辑,以及字段 Vendor_GroupNumber
推荐阅读
- git - Bitbucket Pipelines 部分为空白
- c - 如何继续打印直到你在c中按下一个按钮
- javascript - 包括多个打字稿文件
- java - 我必须将某个等级分类为(A、B、C、D、F),但没有显示错误消息
- node.js - 什么是 npm 缓存清理 --force --unsafe-perm
- javascript - 返回参数函数的数量是用什么来调用的?
- twitter-bootstrap - 山沟阴影
- java - BiConsumer 和一个参数的方法参考
- csv - 使用spark读取多个csv文件时如何从单个文件设置标题?
- django - 网址在 django 中没有唤醒