Programing

SQL WHERE-Clause의 집계 함수

crosscheck 2020. 11. 14. 09:54
반응형

SQL WHERE-Clause의 집계 함수


대학 시험에서 질문이있었습니다. SQL WHERE에서 집계 함수를 사용할 수 있습니까?

나는 항상 이것이 가능하지 않다고 생각했고 어떻게 가능한지 어떤 예도 찾을 수 없습니다. 하지만 내 대답은 거짓으로 표시되었으며 이제 어떤 경우에 .NET Framework에서 집계 함수를 사용할 수 있는지 알고 싶습니다 WHERE. 또한 가능하지 않은 경우 설명 된 사양에 대한 링크를 얻는 것이 좋습니다.


DBMS에 대해 언급하지 않았습니다. MS SQL-Server를 사용한다고 가정하면 설명이 필요없는 T-SQL 오류 메시지를 찾았습니다.

"HAVING 절 또는 선택 목록에 포함 된 하위 쿼리에 있고 집계되는 열이 외부 참조 인 경우가 아니면 집계는 WHERE 절에 나타나지 않을 수 있습니다."

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 모두에서 실행되지만 예상 한 결과를 반환하지 않습니다. 다음은 더 가깝습니다. customeridGROUPed BY 필드 와 쿼리 하위 쿼리 조인에 사용되는 필드 는 외부 테이블의 첫 번째 경우 PRIMARY KEY이고 두 번째 경우에는 그렇지 않습니다.

주문이 5 개 이상인 고객의 모든 고객 ID와 주문 수를 표시합니다 (다른 고객의 경우 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 ;

HAVING은 집계 함수가있는 WHERE와 같거나 하위 쿼리를 사용할 수 있습니다.

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)

WHERE 절에서 직접 집계를 사용할 수 없습니다. 그것이 HAVING 절의 목적입니다.

WHERE 절에 집계를 포함하는 하위 쿼리를 사용할 수 있습니다.


UPDATED query:

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

It'll select all but the last row from the table t.


SELECT COUNT( * )   
FROM agents   
HAVING COUNT(*)>3;  

See more below link:


Another solution is to Move the aggregate fuction to Scalar User Defined Function

Create Your Function:

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

DECLARE @TotalAmount INT

SET @TotalAmount = (select SUM(SaleAmount) FROM Sales where Product=@ProductName)

RETURN @TotalAmount

END

Use Function in Where Clause

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

References:

1. 2.

Hope helps someone.

참고URL : https://stackoverflow.com/questions/6319183/aggregate-function-in-sql-where-clause

반응형