首页 > 解决方案 > 如果一个值有一个覆盖另一个表,检查几个条件

问题描述

我有 4 个表(带有必要的列):这里

无论这些条件的结果是否已满,我都想生成 0 或 1 的 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”)

预期结果如下:

在此处输入图像描述

我正在努力:

  1. 使用 IF_Incoming_FromSeller 获取干净可靠的数据
  2. 修改代码以获得 IF_Incoming_FromSeller 的结果

任何帮助表示赞赏..

标签: sql-serverjoincase-when

解决方案


好的。这个答案并不完美,但我希望它能让你克服当前的障碍。您需要调整逻辑以适应(此处未涵盖的更广泛评论的一部分)。然而,这是开始。

我的第一步是摆脱那些导致你获得额外行数的东西......我想出了这个。

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

推荐阅读