查找属于同一标识符的记录,检查列中多次出现的值

Find records that belong to the same identifier, check for multiple occurences of value in column

我有一个 table 将客户 ID 链接到销售 ID。多个客户可以链接到同一个销售 ID,但是第一个客户应该是类型为 'M' 的主要客户。所有其他客户应键入其他 ('O')。

Cust_ID   Sale_ID  Cust_Type
1         123      'M'
2         123      'O'
3         124      'M'
4         125      'M'
5         125      'O'
6         125      'O'

有时链接到同一销售 ID 的多个客户将是主要 ('M') 客户 - 这是不正确的:

Cust_ID   Sale_ID  Cust_Type
1         123      'M'
2         123      'M'
3         123      'O'

我希望能够做的是 return 客户 ID、销售 ID 和客户类型的列表,其中销售 ID 中的不止一个客户是主要客户。 IE。 Main ('M') 在具有相同销售 ID 的行中出现不止一次。

非常感谢任何帮助!

你是这个意思吗?这可以使用 window 函数来实现。

CREATE TABLE temp(
    Cust_ID INT,
    Sale_ID INT,
    Cust_Type VARCHAR(1)
)
INSERT INTO temp VALUES
(1, 123, 'M'),
(2, 123, 'M'),
(3, 124, 'M'),
(4, 125, 'M'),
(5, 125, 'O'),
(6, 125, 'O');


WITH CTE AS(
    SELECT *, cc = COUNT(*) OVER(PARTITION BY Sale_ID)
    FROM temp 
    WHERE Cust_Type = 'M'
)
SELECT
    Cust_ID,
    Sale_ID,
    Cust_Type
FROM CTE
WHERE cc > 1

DROP TABLE temp

这个怎么样:

SELECT s.Cust_ID, s.Sale_ID, s.Cust_Type
FROM Whosebug s INNER JOIN
    (SELECT Sale_ID
    FROM Whosebug
    WHERE Cust_Type = 'M'
    GROUP BY Sale_ID
    HAVING COUNT(*) > 1) as Multiples ON s.Sale_ID = Multiples.Sale_ID

所以,问题是 sales_id 可以有多个 M 值,而您想检测到这一点。我会通过使用 window 函数来计算这些值来解决这个问题:

select t.*
from (select t.*,
             sum(case when cust_type = 'M' then 1 else 0 end) over (partition by sales_id) as NumMs
      from table t
     ) t
where NumMs > 1;

其实我会用条件NumMs <> 1,因为错过主要客户可能也很重要。