Sql 检查是否有任何客户购买了所有项目,如果已购买所有项目,请将列数据重置为0
需要查询帮助 我需要检查并查看客户是否已购买了列表中的所有项目,如果他们已购买了所有项目,我只想将该客户的timesPurchased列重置为零。这张桌子看起来像这样Sql 检查是否有任何客户购买了所有项目,如果已购买所有项目,请将列数据重置为0,sql,sql-server,Sql,Sql Server,需要查询帮助 我需要检查并查看客户是否已购买了列表中的所有项目,如果他们已购买了所有项目,我只想将该客户的timesPurchased列重置为零。这张桌子看起来像这样 customerId | productId | timesPurchased ------------------------------------------------------- A | 000000001 | 1 A | 000000002 | 1
customerId | productId | timesPurchased
-------------------------------------------------------
A | 000000001 | 1
A | 000000002 | 1
A | 000000003 | 0
B | 000000001 | 1
B | 000000002 | 1
B | 000000003 | 3
在本例中,只有客户B购买了所有三个项目,因此我只想将客户B的timesPurchased列重置为零
逻辑是,找到购买了所有物品的客户,然后将timesPurchased计数器重置为零 也许这是:
SELECT * FROM TableName t
WHERE NOT EXISTS
(
SELECT 1 FROM TableName t1
WHERE t.customerId= t1.customerId
AND t1.timesPurchased = 0
)
因此,对于更新:
UPDATE t SET timesPurchased = 0
FROM TableName t
WHERE NOT EXISTS
(
SELECT 1 FROM TableName t1
WHERE t.customerId= t1.customerId
AND t1.timesPurchased = 0
)
已经有了一些答案,但是这个有点不同,所以我将把它放在一堆上:
UPDATE <table>
SET timesPurchased = 0
WHERE customerID IN
(
SELECT customerID
FROM <table>
WHERE
sum(CASE WHEN timesPurchased > 0 THEN 1 ELSE 0 END) = count(productID)
GROUP by customerID
)
这将测试购买的时间总和是否等于表中ProductID的计数。如果它们相等,则子查询返回customer。如果客户返回到主查询,则该客户的所有记录都将其timesPurchased设置为0。是否应将与customerId、productId相关的所有3个timesPirchased重置为0,还是仅将其中一个重置为0?您希望结果集看起来像什么?
UPDATE <table>
SET timesPurchased = 0
WHERE customerID IN
(
SELECT customerID
FROM <table>
WHERE
sum(CASE WHEN timesPurchased > 0 THEN 1 ELSE 0 END) = count(productID)
GROUP by customerID
)