我有一张表将客户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的行中不止一次出现。
非常感谢任何帮助!
答案 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