1

私はこのテーブルを持っています:

id   |  type |      date    
 1   |    a  |   01/1/2012   
 2   |    b  |   01/1/2012
 3   |    b  |   01/2/2012   
 4   |    b  |   01/3/2012   
 5   |    a  |   01/5/2012   
 6   |    b  |   01/5/2012   
 7   |    b  |   01/9/2012   
 8   |    a  |   01/10/2012   

POV は日付ごとです。2 つの行に同じ日付が含まれている場合、両方が同じ行に表示されます (左結合)。

同じ日付は最大 2 行で共有できます。

したがって、この状況は次のようにはなりません:

 1   |    a  |   01/1/2012   
 2   |    b  |   01/1/2012
 3   |    a  |   01/1/2012

同じ日付にグループがありab左結合を使用して両方を 1 行で表示する場合

日付に group しかない場合はa、単一行として表示します (右側に +null )

日付に b グループしかない場合は、単一行として表示します (左側に +null )

望ましい結果:

   Date         |typeA|typeB  |a'id|b'id
  01/1/2012     |  a  |  b    | 1  |  2
  01/2/2012     |     |  b    |    |  3
  01/3/2012     |     |  b    |    |  4
  01/5/2012     |   a |  b    | 5  |  6
  01/9/2012     |     |  b    |    |  7
  01/10/2012    |   a |       | 8  |  

これは単純だと思いますが、ここでの結合の主なアンカーは日付です。私が遭遇した問題は、1行目を読んだときに、同じ日付のすべての行をテーブルで検索することです...うまくいきました。- 大丈夫です。

しかし、2行目を読むと、それも行い、最初の行が得られます-これはすでにカウントされています...

何か助けはありますか?

ここにSQLフィドルがあります:

https://data.stackexchange.com/stackoverflow/query/edit/82605

4

1 に答える 1

1

ピボットが必要だと思います

 select 
    [date],
    case when [a] IS null then null else 'a' end typea,
    case when [b] IS null then null else 'b' end typeb,
    a as aid,
    b as bid
 from yourtable src
 pivot  (max(id) for type in ([a],[b]))p 

結合でそれをしたい場合..

select ISNULL(a.date, b.date), a.type,b.type, a.id,b.id
from
(select * from yourtable where type='a') a
    full outer join
(select * from yourtable where type='b') b  
    on a.date = b.date
于 2012-10-17T08:59:17.267 に答える