2017-11-09 6 views
-1
+----+---------------+--------------+---------------+--------------+ 
| ID | Country CodeR | CountryCodeB | CountryCodeBR | CountryCodeF | 
+----+---------------+--------------+---------------+--------------+ 
| 1 | US   | US   | US   | UK   | 
| 2 | US   | UK   | US   | PK   | 
| 3 | US   | UK   | PK   | IND   | 
+----+---------------+--------------+---------------+--------------+ 

少なくとも3つの異なる国コードがあるこの表の行の数をカウントしたいと思います。単一テーブルの複数の列の値に基づいてレコードの数を調べる方法SQL

この例では、ID = 1の場合、2つの国別コードしかありませんが、ID = 2と3では3(US、UK、PK)と4(US、UK、PK、IND) 、異なる国コード。したがって、結果は2

とする必要があります。助言がありますか。事前

+2

あなたの質問に当てはまらないタグ​​は使用しないでください。実際に使用しているデータベースが不明なため、データベースタグを削除しました。あなたが実際に使用しているデータベースの* only *のタグを追加してください –

+1

申し訳ありませんが、あなたもこのテーブルのSQLの結果として何を期待するのですか?私はあなたの質問の最初の文を理解していません。 – Gnudiff

+0

dbスキーマ、サンプルデータ、現在および予想される出力を表示します。 \t [** How-to-Ask **](http://stackoverflow.com/help/how-to-ask) \t \t [**スタート**] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/)質問品質を改善し、より良い回答を得る方法を学ぶことができます。 –

答えて

2

のおかげで、少なくとも3 diferentを持っている場合は、だから、一つだけを持つ行は、あなたがより多くを持っている場合は、

SELECT COUNT(*) -- or * for debug 
FROM yourTable 
WHERE 1 - (CASE WHEN CountryCodeR = CountryCodeB THEN 1 ELSE 0 END) 
     - (CASE WHEN CountryCodeR = CountryCodeBR THEN 1 ELSE 0 END) 
     - (CASE WHEN CountryCodeR = CountryCodeF THEN 1 ELSE 0 END) 
     - (CASE WHEN CountryCodeB = CountryCodeBR THEN 1 ELSE 0 END) 
     - (CASE WHEN CountryCodeB = CountryCodeF THEN 1 ELSE 0 END) 
     - (CASE WHEN CountryCodeBR = CountryCodeF THEN 1 ELSE 0 END) >= 0 

を行う複製を取得するので、

X - Y - Z - {X,Y,Z} 

、一つだけが等しくなることを意味します重複したものよりも少なくなります。

+0

上記のクエリから、パフォーマンスに問題があります。自己結合を使って達成できるものはありますか? –

+1

パフォーマンス上の問題がなぜ発生するのか説明してください。何行ですか?自己結合も大きくなるでしょう。あなたはテーブルをアンピボットすることができますが、RDBMSを指定しなかった –

+0

ありがとう@Juan Carlos Oropeza ...それは完璧に働いています... –

関連する問題