Мне нужно исправить проблему с выплатами - пример приведен ниже (отредактировано) - PullRequest
2 голосов
/ 17 ноября 2011
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 дважды существует в таблице клиентов, он должен отображаться один раз в повторной выплате
  • 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 ]

3 голосов
/ 17 ноября 2011

Две независимые от бренда опции:

вариант 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
2 голосов
/ 17 ноября 2011

Я использовал CTE для ограничения вашей таблицы Customer, а также добавил поддержку для конкретных YEAR и MONTH на основе вашего вопроса в комментарии.

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
...