sql-server - 查找没有匹配信用的发票
问题描述
简化表如下所示:
BillID|ProductID|CustomerID|Price|TypeID
------+---------+----------+-----+-------
111111|Product1 |Customer1 | 100| I
111112|Product1 |Customer1 | -100| C
111113|Product1 |Customer1 | 100| I
111114|Product1 |Customer1 | -100| C
111115|Product1 |Customer1 | 100| I
我需要找到具有匹配信用(C)但不是没有匹配信用(最后一条记录)的“奇数”发票的发票(I) - 或者相反(没有相应信用的不匹配发票)。
到目前为止,我有这个:
SELECT Invoices.billid, Credits.billid
FROM
(SELECT B1.billid
FROM billing B1
WHERE B1.typeid='I') Invoices
INNER JOIN
(SELECT B2.billid
FROM billing B2
WHERE B2.typeid='C') Credits
ON Invoices.customerid = Credits.customerid
AND Invoices.productid = Credits.productid
AND Invoices.price = -(Credits.price)
但它显然不起作用,因为它返回的东西看起来像:
billid | billid2
-------+ -------
111111 | 111112
111113 | 111114
111115 | 111114
我想得到的是不匹配的发票清单;
billid |
-------+
111115 |
或者只有匹配的发票;
billid | billid2
-------+ -------
111111 | 111112
111113 | 111114
发票号码(BillID)当然不一定是连续的,它只是一个简化的视图。
任何帮助,将不胜感激。
解决方案
这应该有效。我通过在信用之前添加一些连续的发票来进行测试。下面的查询显示了所有具有匹配信用的发票,如果不存在匹配项,则查询的别名“bar”部分显示为 NULL。
SELECT * FROM (
SELECT
ROW_NUMBER() OVER(Partition By TypeID, CustomerID, ProductID, Price ORDER BY BillID ASC) AS rownumber,
*
FROM Billing
) AS foo
LEFT JOIN
(SELECT
ROW_NUMBER() OVER(Partition By TypeID, CustomerID, ProductID, Price ORDER BY BillID ASC) AS rownumber,
*
FROM Billing
) AS bar
on foo.CustomerID = bar.CustomerID and
foo.ProductID = bar.ProductID and
foo.rownumber = bar.rownumber and
foo.Price = -1*bar.Price
where foo.Price > 1
推荐阅读
- python - python程序无法读取以下xml文件
- bots - 如何创建机器人来玩游戏?
- felogin - felogin 同一个域上的不同/多个登录表单
- c++ - #defined 枚举 Doxygen
- python-3.x - Airflow 2 插件如何从插件文件夹中导入其他文件?
- pandas - 将带有嵌套数组的 Spark 列转换为 numpy 数组?
- python - 只有我的最后一个数据框保存在我的所有工作表 xlsx(python)中
- python - 使用 Scapy 在 Wireshark 中给出的访问协议
- powershell - 使用 powershell 创建 zip
- java - 嵌套for循环和数组索引超出范围异常的问题