2017-11-09 1 views
1

SQL Serverでは、CONTACTSテーブル内のレコードに異なるテーブルタグの特定のタグがあるかどうかを示すビューを作成しています。複数のIIF列を使用したSQLクエリで異なる行を取得する

これは私のクエリです:

SELECT DISTINCT 
    contacts.ID, contacts.NAME, 
    IIF(tags.tag = 'A', 1, 0) as A, 
    IIF(tags.tag = 'B', 1, 0) as B, 
    IIF(tags.tag = 'C', 1, 0) as C, 
    IIF(tags.tag = 'D', 1, 0) as D 
FROM 
    contacts 
LEFT JOIN 
    TAGS ON contacts.ID = TAGS.CONTACT_ID 

私はこのような結果たいと思います:

ID  NAME  A  B  C  D 
------------------------------------ 
1  BOB  1  0  0  1 
1  Charlie 1  0  1  0 

を私は

ID  NAME  A  B  C  D 
------------------------------------ 
1  BOB  1  0  0  0 
1  BOB  0  0  0  1 
1  Charlie 1  0  0  0 
1  Charlie 0  0  1  0 

は、私が見落として何かでなければなりませんが、私はすることができます取得それを見つけません。ゴードン・リノフが言うように

+1

ヒント: 'max()' .. –

答えて

1

使用group by

  • 導入表の別名:

    SELECT c.ID, c.NAME, 
         MAX(CASE WHEN t.tag = 'A' THEN 1 ELSE 0 END) as A, 
         MAX(CASE WHEN t.tag = 'B' THEN 1 ELSE 0 END) as B, 
         MAX(CASE WHEN t.tag = 'C' THEN 1 ELSE 0 END) as C, 
         MAX(CASE WHEN t.tag = 'D' THEN 1 ELSE 0 END) as D 
    FROM contacts c LEFT JOIN 
        TAGS t 
        ON c.ID = t.CONTACT_ID 
    GROUP BY c.ID, c.NAME; 
    

    注クエリを変更します。これにより、クエリの書き込みと読み込みが容易になります。

  • 実際にGROUP BYが必要なので、SELECT DISTINCTを削除しました。
  • IIF()からCASEに変更されました。私は、SQL標準機能を介してMS Accessに下位互換性を持たせるために設計された関数を使用する必要はないと考えています。
3

あなたは、単に標準のSQLの使用はcase whenは、すべてのデータベース(postgresのは、Oracle、SQL Serverとの互換性で、代わりにDISTINCT

SELECT contacts.ID, contacts.NAME 
       , MAX(IIF(tags.tag = 'A', 1, 0)) as A 
       , MAX(IIF(tags.tag = 'B', 1, 0)) as B 
       , MAX(IIF(tags.tag = 'C', 1, 0)) as C 
       , MAX(IIF(tags.tag = 'D', 1, 0)) as D 
FROM   contacts LEFT JOIN 
        TAGS ON contacts.ID = TAGS.CONTACT_ID 
group by 
    contacts.ID, contacts.NAME 

GROUP BY句+ MAX aggreateを使用する必要はあり.. 。)

IIF(tags.tag = 'A', 1, 0) 

に相当します
CASE WHEN tags.tag = 'A' THEN 1 ELSE 0 END 
1
SELECT contacts.ID, contacts.NAME 
       , MAX(IIF(tags.tag = 'A', 1, 0)) as A 
       , MAX(IIF(tags.tag = 'B', 1, 0)) as B 
       , MAX(IIF(tags.tag = 'C', 1, 0)) as C 
       , MAX(IIF(tags.tag = 'D', 1, 0) as D 
FROM   contacts LEFT JOIN 
        TAGS ON contacts.ID = TAGS.CONTACT_ID 
GROUP BY contacts.ID, contacts.NAME 
関連する問題