2017-07-04 2 views
0

Ce problème peut avoir une solution facile, mais malheureusement, je ne peux pas le comprendre.Trouver max et compter dans une jointure

J'ai deux tableaux: le tableau A et le tableau 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 

donc ce que je besoin est d'ajouter le deliveredDate maximum de chaque Id au tableau A, mais seulement si le nombre d'articles livrés dans le tableau B est égal à NoOfItems dans le tableau A.

jusqu'à présent, j'ai écrit cette requête:

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) 

)

Répondre

2

Vous presque aviez:

;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

Je voudrais juste faire cela avec un simple join et group 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; 

On ne sait pas si vous souhaitez attribuer la date de livraison à toutes les lignes, avec NULL valeurs pour les correspondants (comme dans la requête ci-dessus). Ou si vous souhaitez filtrer les lignes non correspondantes (dans ce cas, utilisez where).