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

时间:2015-01-06 23:53:54

标签: sql sql-server

我有一张表将客户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'

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

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:3)

因此,问题是sales_id可能有多个M值,并且您想要检测到这一点。我会通过使用窗口函数来计算这些值:

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,因为错过主要客户也可能很重要。

答案 1 :(得分:0)

这是什么意思?这可以使用窗口函数来实现。

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

答案 2 :(得分:0)

这个怎么样:

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