我有以下的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行属于同一客户(测试客户),该客户具有不同的ShipToCodes
:1、2和3。第二个客户(ARACODE客户)情况类似。每个普通客户和普通客户-2仅有1条记录,带有单个ShipToCode
。
现在,我想在此表上查询结果,其中每个客户只有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) 对应的适当记录。如果我能在上述查询(查询2)中使用查询1的所有结果,那么我就可以获得拥有多个记录的客户的所需单个记录。这可以与第一点的结果结合起来实现所需的最终结果。
再次强调,这可能比我正在遵循的方法更容易。请告诉我如何做到这一点。
[注意:我必须仅使用SQL查询来完成此操作。我不能使用存储过程,因为我最终要使用'Scribe Insight'执行此操作,该工具只允许我编写查询语句。]