2010-12-07 6 views
0

몇 가지 일반적인 조언을 원합니다. 내 테이블과 같이 구성되어 있습니다 (또는 오히려, 나는 주어진 한 테이블에서 작동하도록) :더 많은 SQL 두통

:

> Deliveries 
ID (Primary Key) 
customer 
...(irrelevant fields)... 


> DeliveryItems 
ID (primary key) 
deliveryid (links to ID of deliveries) 
delivered (integer - 2 means delivered, 1 not delivered yet) 
...(irrelevant fields)... 

어쨌든, 내가 만드는 오전 SQL 쿼리에, 나는 다음을 수행해야 사용자는 '배달을위한 고객 매개 변수'인 페이지를 방문하여 해당 고객과 연결된 모든 배달을 표시합니다. 그런 다음 모든 품목이 인도되었는지 여부를 표시하기 위해 동적으로 생성 된 열이 필요합니다. 기본적으로 해당 위탁품의 품목 수가 상태가 '2'인 해당 위탁품의 품목 수와 같은 경우 '가 동일하면 해당 배달에 대한 모든 항목이 배달되었습니다. 어떤 아이디어? 나는 조인과 주변 놀다했지만 나는 :(

감사

을 혼동하고있어
+0

@Abe 거친하지만 공정한! –

+1

여기, 도와 드리겠습니다. 내 대답 옆에있는 확인란을 클릭하기 만하면됩니다. – roufamatic

답변

3
select d.*, 
    case when di.TotalCount = DeliveredCount then 1 else 0 end as DeliveryComplete 
from Deliveries d 
inner join (
    select deliveryID, 
     count(*) TotalCount, 
     count(case when delivered = 2 then 1 end) as DeliveredCount 
    from DeliveryItems 
    group by deliveryID 
) di on d.ID = di.deliveryID 
1

당신은 case/when/then에서 약간의 도움으로 얻을 수 있습니다 :

select d.*, 
case 
    when exists (select * from DeliveryItems di 
       where di.deliveryid = d.id 
       and di.delivered <> 2) 
    then 0 
    else 1 
end as DeliveryComplete 
from Deliveries d 
where d.customer = @customerId 
0

Case 문 :

SELECT 
    DeliveryId, 
    CASE 
     WHEN SUM(Delivered) = 2 * COUNT(Id) THEN 'All items delivered' 
     ELSE 'Not Delivered' 
    END AS [Status] 
FROM 
    DeliveryItems 
GROUP BY 
    DeliveryId 
0

시험해보십시오.

SELECT b.* 
    , CASE WHEN a.min_delivered = 1 THEN 'Get back to work' 
      ELSE 'All done!' 
      END AS [Are they all done] 
FROM 
(
    SELECT customer 
     , MIN(delivered) AS min_delivered 
    FROM Deliveries a 
    JOIN DeliveryItems b 
     ON a.id = b.deliveryid 
    WHERE a.customer = @customer 
    GROUP BY customer 
) a 
JOIN Deliveries b 
    ON a.customer = b.customer 
관련 문제