事前にお詫び申し上げます。これはおそらく基本的な質問と回答ですが、正しい結果を見つけるために検索を言葉で表現する方法がわかりません。
(他の列の中でも)顧客番号のプログラム名を含むテーブルがあります。特定のプログラムが1つだけで、他のプログラムがない顧客を特定する必要があります。簡単な例:
Col1 = Customer_Number、Col2 = Program_Name
顧客1は、2013BA1111、2013BO1161、および2013BO1163に登録されているため、3つのレコードがあります。顧客2は、2013BA1111にのみ登録されているため、レコードは1つだけです。
Teradata SQL Assistantを使用して、WHERE Program_Name = '2013BA1111'を選択すると、顧客1と顧客2の両方がプログラム2013BA1111に登録されているため、両方が返されます。 2013BA1111しかないので、顧客2だけを選択したいと思います。
ありがとう!
標準(ANSI/ISO)SQLでは、派生テーブルが友だちです。ここでは、customerテーブルを、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
おそらくこのようなもの:
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
と等しくないレコードを持つすべての人の内側のクエリと結合され、外側のクエリは結合された内部クエリに一致がないことを確認してください。
私は「Teradata」に慣れていませんが、次のようなSQLでそれを行うことができるはずです。
SELECT
Col1 AS Customer,
COUNT(*) AS TotalOccurences
FROM
YourTable
GROUP BY Col1
HAVING COUNT(*) = 1
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;
これはSQLサーバーでそれを行います。 Teradataが同じかどうかわからない...
select t.Col1, min(t.Col2) from myTable t
group by t.Col1
having count(*) = 1