2017-04-06 9 views
1

データベースの人にとってはおそらく簡単ですが、私はこのSQLの問題と戦っていますその周りに私の心をラップすることができました。私はテーブル自体に自己結合を作成しましたが、別のステートメントがありますが運はありません。両方の基準に対して存在するレコードを同じテーブルで検索し、同じ列に異なる列名で表示する方法

ここでは達成しようとしているものを下の図のように示しています。誰かが私にそれの理由を教えてもらえれば、それはまたすばらしいことになるでしょう。ありがとう

私の基準のために、テーブル上に「IL」と「ND」コードの両方を持つ唯一のユーザー名を選択したいだけです。彼らが「IL」と「ND」を持たない場合は、 は私のデータセットに含まれていないはずです。それらのアカウントを取得した後、私は のように1つの行にinforを表示したいのですが、2つ以上のILまたはND acctsがあれば、そのうち1つを選択して表示したいだけです。

select 
    a.username as username, min(a.myacctnumber) as NDAcctNumer, min(b.myacctnumber) as ILAccNumber 
from 
    Table1 a 
inner join 
    (
      select 
       username, code, myacctnumber 
      from 
       Table1 
      where 
       code = 'IL' 
      group by 
       username, code, myacctnumber 
    ) b 
    on 
     a.username = b.username 
where 
    a.code = 'ND' 
group by 
    a.username 
order by 
    username asc 

これが発生します:ここで

username  Code  MyAcctNumber 
------------------------------------ 
user1  IL   10277 
user1  ND   19754 
user1  BD   19542 
user3  IL   10377 
user4  IL   10477 
user4  ND   18756 
user4  ND   19854 
user4  NF   18745 
user5  IL   95423 
user5  ND   74152 
user5  BC   18745 

は私の結果セットのテーブルには、あなたがテーブル自体にユーザーINNER JOINがこれを達成するためにすることができます

username  NDAcctNumer  ILAccNumber 
------------------------------------------ 
user1   19754   10277 
user4   18756   10477 
user5   74152   95423 
+0

データベースを選択してそれを固執することから始めます(つまり、MySQL **と** SQL Serverにタグを付けないでください - どちらかを選択してください...) – DavidG

+0

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

答えて

1

のように、このようなものをどのように見えるかですin:

------------------------------------------------------ 
| username | NDAcctNumer | ILAccNumber | 
|----------------------------------------------------| 
| user1  |  19754  |  10277  | 
| user4  |  18756  |  10477  | 
| user5  |  74152  |  95423  | 
------------------------------------------------------ 

これを試すにはsql-fiddleを参照してください。

+0

Thanks Satish。この解決策は、なぜ私が自分の問題を解決していないのかを完全に理解しています。 〜W – skinnyWill

0

私は携帯電話に載っていますので、誤植を許してください。

GROUP BYを使用すると、レコードをusernameごとに1行にスクラッシュできます。

MIN()CASEのステートメントを組み合わせて使用​​すると、各フィールドを選択できます。

SELECT 
    username, 
    MIN(CASE code WHEN 'ND' THEN myacctnumber END) AS NDAcctNumber, 
    MIN(CASE code WHEN 'IL' THEN myacctnumber END) AS ILAcctNumber 
FROM 
    YourTable 
GROUP BY 
    username 

あなたが本当に1つまたは他の口座番号を持っていることを例を除外しなければならない場合は、上記1の周りに外側のクエリをラップ、またはHAVING

HAVING 
     MAX(CASE code WHEN 'ND' THEN 1 END) = 1 
    AND MAX(CASE code WHEN 'IL' THEN 1 END) = 1 

を追加使用するか、これは避け潜在的に高価な結合の必要性。

しかし、ごく少数のユーザー名が両方のアカウントタイプを持っていることを知っていれば、JOINバージョンの方が高速になる可能性があります。

関連する問題