Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 解决支付问题_Sql_Sql Server 2005_Join_Duplicate Removal - Fatal编程技术网

Sql 解决支付问题

Sql 解决支付问题,sql,sql-server-2005,join,duplicate-removal,Sql,Sql Server 2005,Join,Duplicate Removal,我重新发布了我的原始问题,并进行了编辑,因为该问题已得到回答,并选择了最佳答案 付款来自我们的供应商,该供应商将支付给客户,销售代表将根据哪个客户获得的金额获得付款 Customers Table (Usage is kwH) +----+----------+------------+----------+----------+----------+-------+-------+ | ID | Customer | Account_no | Meter_no | Supplier | Ac

我重新发布了我的原始问题,并进行了编辑,因为该问题已得到回答,并选择了最佳答案

付款来自我们的供应商,该供应商将支付给客户,销售代表将根据哪个客户获得的金额获得付款

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  |
+------------+----------+-------------+-------------+
这两个表用于代表付款。收到每个账户的付款,并根据账户号和供应商与我们的客户进行匹配。我们无法控制付款表,因为它来自外部。这会产生一些问题,因为我们无法在两个表之间进行一对一的匹配。撇开这一点不谈,我想用某些标准计算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  |
+------------+----------+-------------+-------------+-------------+
注意这里

  • 账户号123在客户表中存在三次,必须在代表支出中显示一次
  • 3笔款项已支付至456号账户,所有三笔款项必须在报告中显示
  • *60=请注意,有两条活动记录(一条非活动记录)。这可能是两个活动的总和。但任何其他值都是可以接受的,如果这使得查询更容易(对于两个或一个中的较大值,而不是另一个)
  • 请注意,输出表中必须出现Usage列,这是给我造成问题的列。如果我不包括这一切都很好
  • 关于“使用情况”列,如果我有两条记录,记录的是同一客户的同一账号和供应商,但使用情况不同,那么当我包括“使用情况”列时,这两条记录就不同了。因此,distinct无法删除此副本
报告按月计算


提问稿

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

这个怎么样:

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

如果需要,还可以在视图中删除非活动记录。

这是一个很好的查询。将在我的实际数据上实现逻辑,并选择接受答案。