【发布时间】:2015-07-26 11:02:07
【问题描述】:
我有以下 SQL 表:
AR_Customer_ShipTo
+--------------+------------+-------------------+------------+
| ARDivisionNo | CustomerNo | CustomerName | ShipToCode |
+--------------+------------+-------------------+------------+
| 00 | 1234567 | Test Customer | 1 |
| 00 | 1234567 | Test Customer | 2 |
| 00 | 1234567 | Test Customer | 3 |
| 00 | ARACODE | ARACODE Customer | 1 |
| 00 | ARACODE | ARACODE Customer | 2 |
| 01 | CBE1EX | Normal Customer | 1 |
| 02 | ZOCDOC | Normal Customer-2 | 1 |
+--------------+------------+-------------------+------------+
(ARDivisionNo, CustomerNo,ShipToCode) 构成该表的主键。
如果您注意到前 3 行属于同一客户(测试客户),他们具有不同的 ShipToCode:1、2 和 3。第二个客户(ARACODE 客户)的情况类似。普通客户和普通客户 2 中的每一个都只有 1 条记录,带有一个 ShipToCode。
现在,我想在此表上查询结果,每个客户只有 1 条记录。因此,对于任何有超过 1 条记录的客户,我希望将价值最高的记录保留为 ShipToCode。
我尝试了各种方法:
(1) 表格中只有一条记录,我可以轻松获取客户列表。
(2) 通过以下查询,我可以获得所有客户的列表,这些客户在表中拥有多条记录。
[Query-1]
SELECT ARDivisionNo, CustomerNo
FROM AR_Customer_ShipTo
GROUP BY ARDivisionNo, CustomerNo
HAVING COUNT(*) > 1;
(3) 现在,为了为上述查询返回的每条记录选择正确的ShipToCode,我无法弄清楚如何遍历上述查询返回的所有记录。
如果我这样做:
[Query-2]
SELECT TOP 1 ARDivisionNo, CustomerNo, CustomerName, ShipToCode
FROM AR_Customer_ShipTo
WHERE ARDivisionNo = '00' and CustomerNo = '1234567'
ORDER BY ShipToCode DESC
然后我可以获得(00-1234567-Test Customer)的相应记录。因此,如果我可以在上述查询 (query-2) 中使用来自 query-1 的所有结果,那么我可以获得具有多个记录的客户所需的单个记录。这可以与第 (1) 点的结果相结合,以获得所需的最终结果。
同样,这比我所遵循的方法更容易。请让我知道我该怎么做。
[注意:我必须仅使用 SQL 查询来执行此操作。我不能使用存储过程,因为我最终将使用“Scribe Insight”来执行这个东西,它只允许我编写查询。]
【问题讨论】:
标签: sql sql-server tsql join duplicate-removal