我有以下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)通过以下查询,我可以获取表中有多个记录的所有客户的列表。
[查询1]
SELECT ARDivisionNo, CustomerNo
FROM AR_Customer_ShipTo
GROUP BY ARDivisionNo, CustomerNo
HAVING COUNT(*) > 1;
(3)现在,为了为ShipToCode
上述查询返回的每条记录选择合适的内容,我不知道如何遍历上述查询返回的所有记录。
如果我做类似的事情:
[查询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的所有结果,那么我可以为具有多个记录的客户获得所需的单个记录。可以将其与点(1)的结果相结合,以获得所需的最终结果。
同样,这比我遵循的方法容易。请让我知道我该怎么做。
[注意:我只能使用SQL查询来执行此操作。我无法使用存储过程,因为我最终将使用“ Scribe Insight”执行该操作,该操作仅允许我编写查询。]
1)使用CTE根据每个客户的ARDivisionNo,CustomerNo获取最大船代号价值记录
WITH cte AS (
SELECT*,
row_number() OVER(PARTITION BY ARDivisionNo, CustomerNo ORDER BY ShipToCode desc) AS [rn]
FROM t
)
Select * from cte WHERE [rn] = 1
2)要删除记录,请使用“删除”查询,而不是“选择”并将“子句”更改为rn> 1。 Sample SQL FIDDLE
WITH cte AS (
SELECT*,
row_number() OVER(PARTITION BY ARDivisionNo, CustomerNo ORDER BY ShipToCode desc) AS [rn]
FROM t
)
Delete from cte WHERE [rn] > 1;
select * from t;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句