Исправление проблемы с выплатой - PullRequest
2 голосов
/ 21 ноября 2011

Я повторно публикую свой исходный вопрос с изменениями, поскольку на этот вопрос был дан ответ и выбран лучший ответ.

Платежи поступают от нашего поставщика, который идет на счета, и представители получаютОплачивается в зависимости от того, какой счет получил, сколько.

Customers 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  |
+------------+----------+-------------+-------------+

Две таблицы используются для повторных выплат.Оплата принимается для каждой учетной записи, они сопоставляются с нашими клиентами на основе Account_No и поставщика.У нас нет контроля над payment_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, все три должны быть указаны в отчете
  • * 60 = Обратите внимание, что есть 2 активные записи (и одна неактивная).Это может быть сумма двух активных.Но любое другое значение является приемлемым, если это облегчает запрос (для большего из двух или одного, а не другого)
  • Обратите внимание, что столбец использования должен появиться в выходной таблице. Это столбец, который создает проблему длямне.Если я не включу это, все будет работать нормально.
  • Точка с колонкой Usage, если у меня есть две записи для одного и того же клиента с одинаковыми Account_No и Supplier, но разным использованием, что делает эти две записи разными, когда я включаю столбец использования.Таким образом, не удается удалить этот дубликат. Different не работает.

Отчеты рассчитываются ежемесячно


Сценарий вопроса

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

1 Ответ

2 голосов
/ 21 ноября 2011

Как насчет этого:

CREATE VIEW v_customers_by_rep
AS
  SELECT SUM(USAGE) AS USAGE ,
         REPID ,
         CAST(account_no AS VARCHAR) + '_' + Supplier AS UniqueId
    FROM customers
GROUP BY CAST(account_no AS VARCHAR) + '_' + Supplier ,
         REPID
GO
DECLARE
  @repid INT

SET @repid = 100

SELECT pr.* ,
       u.Usage
  FROM payments_received pr INNER JOIN v_customers_by_rep u
    ON CAST(pr.account_no AS VARCHAR) + '_' + pr.Supplier = u.UniqueId
WHERE u.repid = @repid

При желании можно также удалить неактивные записи в представлении.

...