नीचे दी गई क्वेरी के लिए मैं isHold नामक एक ध्वज रखना चाहता हूं जो 0 . का मूल्यांकन करेगा यदि कोई billNo दृश्य से नहीं है viewBills onHold तालिका में मौजूद है और 1 अन्यथा

select max(t.id) TrackingID , max(vb.billNo) billNo, cb.id  ,
max(case when vb.[count] > 1 then 1 else 0 end) isMultiple ,
max(case when t.TrackingID = 31 then 1 else 0 end) IsCancelled,
max(case when exists (select 1 from OnHold oh
where oh.billNo = billNo) then 1 else 0 end) IsHold

from viewBills vb
join tracking t on vb.billNo = t.billNo
join customerBills cb on vb.billNo = cb.billNo 
join customerPieces cp on  cb.id = cp.customerBillId
where cb.statusid <> 3
group by cb.id

निष्पादित करते समय मुझे यह त्रुटि मिली

Cannot perform an aggregate function on an expression 
containing an aggregate or a subquery.

यह उचित है लेकिन इसे कैसे प्राप्त किया जा सकता है?

0
Alvaro 15 सितंबर 2020, 14:48

2 जवाब

सबसे बढ़िया उत्तर

तर्क को FROM खंड में ले जाने के लिए आप outer apply या left join का उपयोग कर सकते हैं:

select max(t.id) as TrackingID , max(vb.billNo) as billNo, cb.id ,
       max(case when vb.[count] > 1 then 1 else 0 end) as isMultiple,
       max(case when t.TrackingID = 31 then 1 else 0 end) as IsCancelled,
       max(case when oh.billNo is not null then 1 else 0 end) as IsHold
from viewBills vb join
     tracking t
     on vb.billNo = t.billNo join
     customerBills cb
     on vb.billNo = cb.billNo  join
     customerPieces cp
     on cb.id = cp.customerBillId outer apply
     (select top (1) oh.*
      from OnHold oh
      where oh.billNo = cb.billNo
     ) oh
where cw.statusid <> 3
group by cb.id;
1
Gordon Linoff 15 सितंबर 2020, 14:53

आप LEFT OUTER JOIN के लिए जा सकते हैं और नीचे दिए गए अनुसार एकत्रीकरण कर सकते हैं:

select max(t.id) TrackingID , max(vb.billNo) billNo, cb.id  ,
max(case when vb.[count] > 1 then 1 else 0 end) isMultiple ,
max(case when t.TrackingID = 31 then 1 else 0 end) IsCancelled,
max(case when oh.billNo IS NOT NULL then 1 else 0 end) IsHold

from viewBills vb
join tracking t on vb.billNo = t.billNo
join customerBills cb on vb.billNo = cb.billNo 
join customerPieces cp on  cb.id = cp.customerBillId
LEFT OUTER JOIN OnHold oh ON oh.billNo = vb.billNo
where cb.statusid <> 3
group by cb.id
1
Venkataraman R 15 सितंबर 2020, 15:05