questions - sql software




SQL WHERE-Clause में एग्रिगेट फ़ंक्शन (4)

HAVING जहां कुल कार्यों के साथ है, या आप एक सबक्वेरी का उपयोग कर सकते हैं।

select EmployeeId, sum(amount)
from Sales
group by Employee
having sum(amount) > 20000

या

select EmployeeId, sum(amount)
from Sales
group by Employee
where EmployeeId in (
    select max(EmployeeId) from Employees)

विश्वविद्यालय में एक परीक्षण में एक सवाल था; क्या SQL WHERE क्लॉज में एक कुल फ़ंक्शन का उपयोग करना संभव है।

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


अद्यतन क्वेरी:

select id from t where id < (select max(id) from t);

यह टेबल टी से सभी लेकिन अंतिम पंक्ति का चयन करेगा।


आपने DBMS का उल्लेख नहीं किया है। मान लें कि आप MS SQL- सर्वर का उपयोग कर रहे हैं, मुझे एक T-SQL त्रुटि संदेश मिला है जो स्व-व्याख्यात्मक है:

"जब तक यह HAVING क्लॉज या किसी चयनित सूची में समाहित नहीं है, और कॉलम को एकत्रित किया जा रहा है, तब तक बाहरी संदर्भ नहीं है"

http://www.sql-server-performance.com/

और एक उदाहरण है कि यह एक उपशम में संभव है।

उन सभी ग्राहकों और छोटे ऑर्डर दिखाएं जिनके पास 5 या अधिक ऑर्डर हैं (और दूसरों के लिए NULL):

SELECT a.lastname
     , a.firstname
     , ( SELECT MIN( o.amount )
         FROM orders o
         WHERE a.customerid = o.customerid
           AND COUNT( a.customerid ) >= 5
        )
        AS smallestOrderAmount
FROM account a
GROUP BY a.customerid
       , a.lastname
       , a.firstname ;

अद्यतन करें।

उपरोक्त SQL-Server और MySQL दोनों में चलता है लेकिन यह अपेक्षित परिणाम नहीं देता है। अगला और अधिक करीब है। मुझे लगता है कि इसका उस क्षेत्र के customerid साथ क्या करना है, ग्रुप बीड और क्वेरी-सबक्वेरी जॉइन में उपयोग किया जाता है, यह पहले मामले में बाहरी तालिका का प्राथमिक कुंजी है और दूसरे मामले में यह नहीं है।

5 या अधिक ऑर्डर करने वालों के लिए सभी ग्राहक आईडी और ऑर्डर की संख्या (और दूसरों के लिए NULL) दिखाएं:

SELECT o.customerid
     , ( SELECT COUNT( o.customerid )
         FROM account a
         WHERE a.customerid = o.customerid
           AND COUNT( o.customerid ) >= 5
        )
        AS cnt
FROM orders o
GROUP BY o.customerid ;

एक अन्य उपाय स्केलर यूजर डिफाइन्ड फंक्शन को एग्रीगेट फक्शन को स्थानांतरित करना है

अपना कार्य बनाएँ:

CREATE FUNCTION getTotalSalesByProduct(@ProductName VARCHAR(500))
RETURNS INT
AS
BEGIN

DECLARE @TotalAmount INT

SET @TotalAmount = (select SUM(SaleAmount) FROM Sales where Product[email protected]ProductName)

RETURN @TotalAmount

END

जहां क्लॉज में फ़ंक्शन का उपयोग करें

SELECT ProductName, SUM(SaleAmount) AS TotalSales
FROM Sales
WHERE dbo.getTotalSalesByProduct(ProductName)  > 1000
GROUP BY Product

संदर्भ:

1. 2.

आशा किसी की मदद करती है।





sql