2014-02-11 38 views
2

我很抱歉,這可能是一個基本的問題,但我不知道如何將搜索字詞找到合適的結果。在多列可能的列中選擇只有一個值的記錄

我有一個表格(包括其他列)包含客戶編號的程序名稱。我需要確定只有一個特定程序但沒有其他客戶的客戶。一個簡單的例子:

Col1中= CUSTOMER_NUMBER,Col2中= PROGRAM_NAME

顧客1具有三個記錄,因爲它們是在2013BA1111,2013BO1161和2013BO1163註冊。客戶2只有一條記錄,因爲他們只在2013BA1111註冊。

使用Teradata SQL助手,如果我選擇WHERE Program_Name ='2013BA1111',那麼客戶1和客戶2都將被返回,因爲他們都被註冊到程序2013BA1111中。我只想選擇客戶2,因爲他們只有2013BA1111。

謝謝!

回答

3

在標準( ANSI/ISO)SQL,派生表是你的朋友。在這裏,我們加入了客戶對錶產生具有客戶名單派生表只有1

select * 
from customer c 
join (select customer_id 
     from customer 
     group by customer_id 
     having count(program_name) = 1 
    ) t on t.customer_id = c.customer_id 
where ... -- any further winnowing of the result set occurs here 
+0

這也適用,謝謝! – user3298276

1

也許是這樣的:

select Customer_Number, Program_Name 
from YourTable t1 
left join (
    select Customer_Number 
    from YourTable t2 
    where t2.Program_Name <> '2013BA1111' 
) t3 on t1.Customer_Number = t3.Customer_Number 
where 
t1.Program_Name = '2013BA1111' 
and t3.Customer_Number is null 

外部查詢是選擇具有給定的Program_Name所有記錄,然後將其加入了與每個人的內查詢誰擁有不等於給定Program_Name記錄,並且外部查詢將檢查以確保連接的內部查詢不匹配。

+0

我會認爲'2013BA1111'只是一個例子 – OlleR

+0

正確。這是OP在他的帖子中使用的那個。 –

+0

是的,但我的意思是user3298276不想獲取特定的行。任何行只出現一次是什麼問我猜 – OlleR

0

這將在SQL服務器中完成。不知道的Teradata是一樣的...

select t.Col1, min(t.Col2) from myTable t 
group by t.Col1 
having count(*) = 1 
+0

這個工作,但只適用於2013BA1111,因爲所有的客戶都有這個程序。如果我擔心另一個程序,它可能不會 - 但這也確實回答了我的迫切需求......謝謝! – user3298276

1

我不熟悉「Teradata的」,但你應該能夠做到這一點的SQL的東西,如:

SELECT 
    Col1 AS Customer, 
    COUNT(*) AS TotalOccurences 
FROM 
    YourTable 
GROUP BY Col1 
HAVING COUNT(*) = 1 
+0

這個工作,但只適用於2013BA1111,因爲所有的客戶都有這個程序。如果我擔心另一個程序,它可能不會 - 但這也確實回答了我的迫切需求......謝謝! – user3298276

0

你只需要CUSTOMER_NUMBER或其他列?

SELECT Customer_Number 
FROM tab 
GROUP BY 1 
HAVING SUM(CASE WHEN Program_Name = '2013BA1111' THEN 0 ELSE 1 END) = 1; 

SELECT * 
FROM tab AS t1 
WHERE Program_Name = '2013BA1111' 
AND NOT EXISTS 
(
    SELECT * FROM tab AS t2 
    WHERE t1.Customer_Number = t2.Customer_Number 
    AND Program_Name <> '2013BA1111' 
); 

SELECT * 
FROM tab 
QUALIFY 
    SUM(CASE WHEN Program_Name = '2013BA1111' THEN 0 ELSE 1 END) 
    OVER (PARTITION BY Customer_Number) = 1; 
+0

雖然這可能工作,如果我有這種需要,它有點超出我的理解。我大概可以花一些時間來解決問題,但我認爲現在有些簡單的答案已經足夠了。謝謝! – user3298276

相關問題