web-dev-qa-db-ja.com

複数の可能性がある列で値が1つしかないレコードを選択する

事前にお詫び申し上げます。これはおそらく基本的な質問と回答ですが、正しい結果を見つけるために検索を言葉で表現する方法がわかりません。

(他の列の中でも)顧客番号のプログラム名を含むテーブルがあります。特定のプログラムが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だけを選択したいと思います。

ありがとう!

6
user3298276

標準(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
6
Nicholas Carey

おそらくこのようなもの:

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と等しくないレコードを持つすべての人の内側のクエリと結合され、外側のクエリは結合された内部クエリに一致がないことを確認してください。

1
Aaron Palmer

私は「Teradata」に慣れていませんが、次のようなSQLでそれを行うことができるはずです。

SELECT 
     Col1 AS Customer,
     COUNT(*) AS TotalOccurences
FROM
     YourTable
GROUP BY Col1
HAVING COUNT(*) = 1
1
b.runyon

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
dnoeth

これはSQLサーバーでそれを行います。 Teradataが同じかどうかわからない...

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