清理其中包含太多 DISTINCT 子句的 SQL Server 查询

问题描述 投票:0回答:1

在 SQL Server 中,我在

Visit
Customer
表之间有一个连接表
Store

我正在努力寻找:

  • 客户 ID 列表
  • 访问过 1 家商店(StoreID)的人。
  • 除了我只对访问过特定商店(1、10、16、42)的顾客感兴趣
  • 因此我想拒绝访问过商店 1 和 2 的顾客,因为他们访问过多家商店。
  • 如果客户多次访问同一家商店,我想将它们包含在结果中 -
    Visit
    表包含日期和其他字段,因此同一客户会在多个日期进行多次访问。

我认为以下查询是正确的 - 因为它似乎返回了正确的结果:

SELECT DISTINCT v.CustomerID
FROM Visit v
INNER JOIN (
    SELECT CustomerID FROM (SELECT DISTINCT CustomerID, StoreID FROM Visit) temp
    GROUP BY CustomerID
    HAVING COUNT(*) = 1
) c
ON v.CustomerID = c.CustomerID
WHERE v.StoreID IN (1, 10, 16, 42)

但是我想知道是否有任何方法可以简化/清理它,因为其中有多个 DISTINCT 和 GROUP BY 子句。

注意:这并不理想,但如果有必要,我可以接受一个查询,该查询返回以任意组合、任意次数访问过任何所需商店(1、10、16、42)的客户,只要他们没有访问过访问了不在该列表中的商店。

sql sql-server
1个回答
0
投票

也许是这样的:

    SELECT v.CustomerID, MAX(v.StoreID) AS StoreID
    FROM Visit v
    GROUP BY CustomerID
    HAVING COUNT(DISTINCT v.StoreID) = 1
    AND MAX(v.StoreID) IN (1, 10, 16, 42)

COUNT(DISTINCT StoreID)
为您的顾客提供只有一家独特的商店

要获取它是哪家商店,我使用

MAX(x.StoreID)
。 MAX 或 MIN 在这里并不重要,只要它是某种聚合即可。

© www.soinside.com 2019 - 2024. All rights reserved.