2017-04-06 38 views
1

我一直在與這個對於數據庫人員來說很容易的sql問題作鬥爭,但我還沒有我已經能夠說服自己了。我創建了一個自我加入到表本身,並有一個明確的聲明,但沒有運氣我如何在同一張桌子上找到兩個標準存在的記錄,並將它們顯示在不同列名下的同一行中

這是在我想要實現的圖表視圖。如果有人也可以給我指示爲什麼這一切都會很棒。謝謝

對於我的標準,我只想選擇在表上同時具有'IL'和'ND'代碼的唯一用戶名。如果他們只有'IL'並且沒有'ND',那麼他們應該不包括在我的數據集中 。得到這些帳戶後,我想在這裏顯示一行,如 ,如果他們有更多的2或更多IL或ND accts我只想選擇其中1顯示。

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 

這裏是我的結果集表會是什麼樣子

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

我會從挑選數據庫開始並堅持使用它(即不要標記MySQL **和** SQL Server - 請選擇一個...) – DavidG

+0

請不要使用不適用於您的問題的標籤。我刪除了數據庫標記,因爲它不清楚你實際使用了哪一個。請添加*標籤*您實際使用的數據庫 –

回答

1

您可以將用戶INNER JOIN與表本身來實現這一點,是這樣的:

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 | NDAcctNumer | ILAccNumber | 
|----------------------------------------------------| 
| user1  |  19754  |  10277  | 
| user4  |  18756  |  10477  | 
| user5  |  74152  |  95423  | 
------------------------------------------------------ 

你可以參考這個sql-fiddle來嘗試一下。

+0

謝謝Satish。這個解決方案對我爲什麼沒有解決我的問題很有意義。 〜w ^ – skinnyWill

0

我在我的手機上,所以請原諒錯別字。

根據username,您可以使用GROUP BY將記錄擠壓成單行。

然後,您可以使用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 

如果你真的必須排除只有一個或其他賬號的情況下,你可以環繞上面的一個外部查詢,或者使用追加HAVING條款

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

這就避免了需要潛在的昂貴連接。

但是,如果您知道一個非常小的百分比的用戶名有兩種帳戶類型,那麼JOIN版本可以更快。 (過濾到非常低的行數,然後加入。)

相關問題