2017-07-08 19 views
0

私は結果が設定した設定:は、以下のように

上記結果セット内
+---------+-----------+--------+-----------------+ 
| ChildID | ReleaseID | Status | ParentSignature | 
+---------+-----------+--------+-----------------+ 
| 1152 |  68 | Yes |     | 
| 1152 |  70 | Yes |     | 
| 5059 |  68 | Yes | ad    | 
| 5410 |  68 | Yes | 111    | 
| 5410 |  70 | Yes | 111    | 
| 5410 |  71 | Yes |     | 
+---------+-----------+--------+-----------------+ 

、リリースID列の3つの異なる値が存在するような68、70及び71. すべてのリリースIDに対応するレコードが1つの子ID(5410)のみです。

私の要件は、リリースIDごとに子ごとのレコードが残りの列に空白の値を持つ出力結果セットを取得することです。 最大別個のリリースIDの数はさまざまです。この例では、3つのリリースIDがあります。

予想される出力: -

+---------+-----------+--------+-----------------+ 
| ChildID | ReleaseID | Status | ParentSignature | 
+---------+-----------+--------+-----------------+ 
| 1152 |  68 | Yes |     | 
| 1152 |  70 | Yes |     | 
| 1152 |  71 |  |     | 
| 5059 |  68 | Yes | ad    | 
| 5059 |  70 |  |     | 
| 5059 |  71 |  |     | 
| 5410 |  68 | Yes | 111    | 
| 5410 |  70 | Yes | 111    | 
| 5410 |  71 | Yes |     | 
+---------+-----------+--------+-----------------+ 

答えて

2
select 1152 as clientid,  68 as releaseid , 'Yes' as status , '' as ParentSignature into #input  
union select 1152 ,  70 , 'Yes' , ''    
union select 5059 ,  68 , 'Yes' , 'ad '   
union select 5410 ,  68 , 'Yes' , '111 '   
union select 5410 ,  70 , 'Yes' , '111 '   
union select 5410 ,  71 , 'Yes' , '' 

WITH Clients 
AS (
    SELECT DISTINCT ClientId 
    FROM #Input 
    ) 
    ,Releases 
AS (
    SELECT DISTINCT releaseid 
    FROM #input 
    ) 
    ,ClientReleases 
AS (
    SELECT ClientId 
     ,ReleaseId 
    FROM Clients 
    CROSS JOIN Releases 
    ) 
SELECT * 
FROM #input 

UNION 

SELECT ClientId 
    ,ReleaseId 
    ,'' 
    ,'' 
FROM ClientReleases cr 
WHERE NOT EXISTS (
     SELECT 1 
     FROM #input i 
     WHERE i.clientid = cr.clientid 
      AND i.releaseid = cr.releaseid 
     ) 
+0

¬1私は '取っこの回答からINTO'を選択します。 –

0
select * 
into #input 
from (
    select 1152 as clientid,  68 as releaseid , 'Yes' as status , '' as ParentSignature union all 
    select 1152 ,  70 , 'Yes' , ''  union all  
    select 5059 ,  68 , 'Yes' , 'ad ' union all  
    select 5410 ,  68 , 'Yes' , '111 ' union all  
    select 5410 ,  70 , 'Yes' , '111 ' union all  
    select 5410 ,  71 , 'Yes' , ''  
) x 

SELECT * FROM #input x 

SELECT b.clientid 
FROM #input b 
GROUP BY b.clientid 
HAVING COUNT(DISTINCT b.releaseid) = (SELECT COUNT(DISTINCT a.releaseid) FROM #input a) 

enter image description here

注:その後、私はCOUNT(DISTINCT b.releaseid)からDISTINCTを削除します{clientid, releaseid}に定義されたUNIQUEインデックス/制約がある場合。あなたは以下のように問い合わせることができます

1

;With cte as (
    SELECT distinct clientid, a.releaseid FROM #input x 
    cross apply (select distinct releaseid from #input) a 
) Select c.*, i.[Status], i.ParentSignature from cte c 
    left join #input i 
    on c.clientid = i.clientid 
    and c.releaseid = i.releaseid 
関連する問題