2017-07-04 9 views
0

この問題は簡単な解決方法があるかもしれませんが、残念ながら私はそれを理解できません。1回の参加で最大値とカウントを見つける

私は2つのテーブルを持っています。表Aと表B

Table A       Table B 
-------------------    ------------------------------  
Id  NoOfItems    Id  itemNo   deliveredDate 
X1   3     X1  1    2017-07-01 
           X1  2    2017-07-02 
           X1  3    2017-07-03 

は、だから私は必要なものを、表Aに各IDの最大deliveredDateを追加することであるが、表Bでの配信アイテムの数が等しい場合にのみ、表AにNoOfItemsは

これまでのところ、私はこのクエリを書かれている:

SELECT * 
FROM A 
OUTER APPLY 
    (
    SELECT TOP 1 * 
    FROM B 
    WHERE A.Id =B.Id 
    ORDER BY 
      B.DeliveredDate DESC 
    ) s 
    where A.NoOfItems= (select count(1) from B) 

答えて

2

あなたはほとんどそれを持っていた:

;with A as 
(select 1 ID, 3 NoOfItems 
union all select 2 ID, 2 NoOfItems 
union all select 3 ID, 1 NoOfItems 
) 
, B as 
(select 1 id, 1 itemno, '2017-07-01' deliveredDate 
union all select 1, 2, '2017-07-02' 
union all select 1, 3, '2017-07-03' 
union all select 2, 1, '2017-08-02' 
union all select 2, 2, '2017-08-03' 
) 
SELECT * 
FROM A 
OUTER APPLY 
    (
    SELECT TOP 1 * 
    FROM B 
    WHERE A.Id =B.Id 
    ORDER BY 
      B.DeliveredDate DESC 
    ) s 
    where A.NoOfItems = (select count(1) from B WHERE B.id = A.ID) 
1

私は単純なjoingroup byでこれを行うだろう:

select a.*, 
     (case when b.cnt = a.noofitems then b.deliveredDate end) 
from a join 
    (select b.id, count(*) as cnt, max(deliveredDate) as deliveredDate 
     from b 
     group by b.id 
    ) b; 
    on a.id = b.id; 

あなたがNULL値で、すべての行に配信日付を割り当てるかどうかは不明です一致するものについては(上記のクエリのように)。または、一致しない行を除外したい場合(この場合はwhereを使用します)。

関連する問題