SQL Server : count() for each group, but only groups having 1+ element like... AND all elements like -


तालिकाओं (और स्तंभ) जैसे हैं:

  • ग्राहक (clientid)
  • मकान (houseID)
  • दर्शक (clientid, houseID, visit_date)
  • <कोड> संविदा (contractID, houseID, clientid, rentDate_from, rentDate_end)

मैं इस तरह के एक SQL क्वेरी लिखने के लिए समस्या है:

  • उनमें से एक को किराए पर लेने से पहले, प्रत्येक ग्राहक को घरों की कितनी बार यात्रा हुई थी?

सभी विज़िट्स को सूचीबद्ध करते हुए, प्रत्येक ग्राहक के लिए कुल संख्या की विज़िट की गणना करना आसान है, clientid और प्रत्येक समूह के लिए गिनती (*) का चयन।

मान लीजिए कि इस select_1 है, और select_2 सभी ग्राहकों के लिए सभी अनुबंधों लिस्टिंग रहा है।

< P> Select_1 का जवाब नहीं है, क्योंकि गिनती केवल समूहों पर ही की जानी चाहिए, जो:

  • कम से कम 1 पंक्ति "पसंद" पंक्ति में select_2 (इसका मतलब है कि कम से कम एक दौरा किये गए घरों को किराए पर लिया गया था, क्योंकि यह ग्राहक हो सकता है कुछ मकानों को देखा, लेकिन दूसरे को किराए पर लिया, घर नहीं गए)।

    जहां s1.clientID = s2.clientID और s1.houseID = s2.houseID

  • प्रत्येक समूह: इस के लिए मेरे विचार के साथ select_1 और select_2 तुलना कर रहा है एक ही दिन की तारीख या अनुबंध तिथि

    हो सकता है की तुलना में पहले वाली सभी पंक्तियों (विज़िट) होना चाहिए: DateDiff (दिन, s1.visit_date, s2.rentDate_from) & gt; = 0 < / P>

(क्यों प्रवेश करने के बाद इस फ़ोरम पर 1 खाली पंक्ति है?)

होवेिंग खंड एक समस्त क्वेरी से समूहों को फ़िल्टर करने के लिए कार्य करता है। यह एक WHERE खंड के समान है, लेकिन कुल परिणाम पर लागू होता है इस विशेष मामले में, यह भी पता चला है कि आप प्रारंभिक परिणाम पंक्तियों को बनाने और समूहों को फ़िल्टर करने के लिए अनिवार्य रूप से एक ही क्वेरी का उपयोग करना चाहते हैं; एसक्यूएल सर्वर के लिए, एक के साथ खंड आपको उस क्वेरी को एक बार करने और इसे पुन: उपयोग करने की अनुमति देता है। इस प्रकार, आप कुछ इस तरह से खत्म हो सकता है:

  previousVisits (clientid, houseId_visited, houseId_rented) का चयन करें Visits.clientId, Visits.houseId, Contracts.houseId रूप से होने वाली विज़िट के दौरे पर संविदा में शामिल हों। ClientId = Contracts.clientId जहां विज़िट्स विज़िट_डेट & lt; = Contracts.rentDate_from SELECT clientId, houseId_Rented, COUNT (*) के रूप में यात्राकार्ड पिछला विजिट्स pv1 ग्रुप द्वारा ग्राहक आईआईडी, घरआदेशित घर हो रही है IED_rented में (चयन घरआपकी पिछली विज़िट से pv2 WHERE pv2.clientId = clientId और Pv2.houseId_rented = houseId_rented)  

ध्यान दें कि आपको इस मामले पर विचार करना चाहिए कि क्या वह ऐसा करता है जो उसी ग्राहक को दो अलग-अलग घरों को किराए पर लेता है जैसा लिखा है, प्रत्येक घर के किराए पर लेने के लिए यह सभी घरों को उस किराये से पहले का दौरा किया जाएगा। फिर भी एक संभावित समस्या है, अगर एक ही ग्राहक एक से अधिक घरों को किराए पर लेता है।


Comments

Popular posts from this blog

python - Strange behavior using PyQt4's 'pyqtSlot' decorator before another decorator -

c# - UnhandledExceptionMode.ThrowException for AppDomain.UnhandledException -

c# - Process.Kill() returns access denied -