我需要修复支付问题 - 下面给出的例子(重新编辑)

时间:2011-11-16 22:18:53

标签: sql sql-server-2005 join duplicate-removal

Customer Table (usage is kwH)
+----+----------+------------+----------+----------+----------+-------+-------+
| ID | Customer | Account_no | Meter_no | Supplier |  Active  | Usage | Repid | 
+----+----------+------------+----------+----------+----------+-------+-------+
|  1 | Joe      |        123 |      111 | NSTAR    | active   |  20   |  100  |
|  2 | Joe      |        123 |      222 | NSTAR    | active   |  30   |  100  |
|  3 | Joe      |        123 |      150 | NSTAR    | inactive |  60   |  100  |
|  4 | Sam      |        456 |      352 | SEP      | active   |  50   |  100  |
|  5 | Jill     |        789 |      222 | FES      | active   |  40   |  200  |
|  6 | Mike     |        883 |      150 | ABB      | inactive |  40   |  200  |
+----+----------+------------+----------+----------+----------+-------+-------+


Payment_Receive (table)
+------------+----------+-------------+-------------+
| Account_no | Supplier | Amount_paid | PaymentDate |
+------------+----------+-------------+-------------+
|        123 | NSTAR    | 20          | 2011-11-01  |
|        456 | SEP      | 40          | 2011-11-01  |
|        456 | SEP      | -40         | 2011-11-01  |
|        456 | SEP      | 40          | 2011-11-01  |
|        789 | FES      | 50          | 2011-11-01  |
|        883 | ABB      | 30          | 2011-11-01  |
+------------+----------+-------------+-------------+

这两张表用于代表支付。我们无法控制payout_table,因为它来自外部。这会产生某些问题,因为我们无法在两个表之间进行一对一的匹配。抛开这一点,我希望按照一定的标准计算RepID = 100的支付金额。这是我希望看到的RepId = 100

的输出
+------------+----------+-------------+-------------+-------------+
| Account_no | Supplier | Amount_paid |    Usage    | PaymentDate |
+------------+----------+-------------+-------------+-------------+
|        123 | NSTAR    | 20          |    60*      | 2011-11-01  |
|        456 | SEP      | 40          |    50       | 2011-11-01  |
|        456 | SEP      | -40         |    40       | 2011-11-01  |
|        456 | SEP      | 40          |    40       | 2011-11-01  |
+------------+----------+-------------+-------------+-------------+

请注意

  • Account_no 123在customers表中存在两次,它必须在rep payout中显示一次
  • 3笔款项已支付给account_no 456,这三笔款项必须在报告中显示

报告按月计算


脚本例如(使用用户列更新)

create database testcase
go

use testcase 
go

create table customers (
  id int not null primary key identity,
  customer_name varchar(25),
  account_no int,
  meter_no int,
  supplier varchar(20),
  active varchar(20),
  usage int,
  repid int
)

create table payments_received (
  account_no int,
  supplier varchar(20),
  amount_paid float,
  paymentdate smalldatetime
)

insert into customers values('Joe',123, 111,'NSTAR','active',20,100)
insert into customers values('Joe',123, 222,'NSTAR','active',30, 100)
insert into customers values('Joe',123, 150,'NSTAR','inactive',60,100)

insert into customers values('Sam',456, 352,'SEP','active',40,100)
insert into customers values('Jill',789, 222,'FES','active',40,200)
insert into customers values('Mike',883, 150,'ABB','inactive',40,200)

select * from customers

insert into payments_received values(123,'NSTAR',20,'2011-11-01')
insert into payments_received values(456,'SEP',40,'2011-11-01')
insert into payments_received values(456,'SEP',-40,'2011-11-01')
insert into payments_received values(456,'SEP',40,'2011-11-01')

insert into payments_received values(789,'FES',50,'2011-11-01')
insert into payments_received values(883,'ABB',30,'2011-11-01')

select * from payments_received

已更新:已更新问题和脚本

  • 用法已添加到客户表

  • 用法必须出现在结果表

* 60 =请注意,有2条活动记录(和一条非活动记录)。这可能是两者的总和,即更大的总和。创建此列时会删除重复项

2 个答案:

答案 0 :(得分:3)

两个独立于数据库品牌的选项:

选项1:

  Select 
   * 
  from 
      Payment_Receive PR
    inner join 
      (select distinct Account_no, Supplier 
       From Customer where Repid = 100 )  C
    on (PR.Account_no = C.Account_no 
       and PR.Supplier = C.Supplier )

选项2:

  Select 
   * 
  from 
      Payment_Receive PR
  Where exists
      (select *
       From Customer C
       where 
          Repid = 100 and
          PR.Account_no = C.Account_no and
          PR.Supplier = C.Supplier )

,日期范围:

选项1:

  Select 
   * 
  from 
      Payment_Receive PR
    inner join 
      (select distinct Account_no, Supplier 
       From Customer where Repid = 100 )  C
    on (PR.Account_no = C.Account_no 
       and PR.Supplier = C.Supplier )
   where
     year(PR.PaymentDate) = 2011 and
     month(PR.PaymentDate) = 11

选项2:

  Select 
   * 
  from 
      Payment_Receive PR
  Where exists
      (select *
       From Customer C
       where 
          Repid = 100 and
          PR.Account_no = C.Account_no and
          PR.Supplier = C.Supplier )
   and
     year(PR.PaymentDate) = 2011 and
     month(PR.PaymentDate) = 11

答案 1 :(得分:2)

我使用CTE来限制您的Customer表格,并根据您在评论中的问题添加对特定YEARMONTH的支持。

WITH customersCte AS
(
   SELECT id, customer_name, account_no, meter_no, supplier, active, repid
      , ROW_NUMBER() OVER (PARTITION BY account_no ORDER BY account_no ASC) AS rowNumber
   FROM customers
)
SELECT  pr.Account_no, pr.Supplier, pr.Amount_paid, pr.PaymentDate
FROM payments_received AS pr
INNER JOIN customersCte AS c ON pr.account_no = c.account_no
WHERE c.repid = 100
   AND c.rowNumber = 1
   AND YEAR(pr.PaymentDate) = 2011
   AND MONTH(pr.PaymentDate) = 11