본문 바로가기

문돌이 존버/DB 및 SQL 스터디

Postgresql function, as keyword, typecasting 사용하기

반응형

아래 쿼리문은 ROUND 함수, AS Keyword, Typecasting을 사용한 것입니다. 먼저 ROUND 함수는 파이썬에서 사용하는 기능과 똑같이 작동합니다. 어떤 숫자가 입력되면 소수점 몇 번째까지 표시할 것인지 정하는 것이죠. 

ROUND("NUMBER", n): 소수점 n 번째 자리까지 NUMBER을 표시한다

Typecasting은 데이터 타입을 바꿀 수 있는 기능입니다. ROUND 함수의 경우 파라미터로 숫자형 타입이 와야 하는데요, 아래 쿼리문에서 보듯이 SUM() 함수를 통과하면 데이터 타입이 numeric이 아닌 double precision으로 됩니다. 따라서 이를 numeric 타입으로 바꿔야 하는 것이죠. 

CAST("original data type" AS "data type you want to change"): 기존의 데이터 타입을 새로 원하는 타입으로 변경한다

AS Keyword는 새롭게 필드명을 정의할 수 있습니다. 아래의 경우 Subtotal은 기존 테이블에 없는 필드명입니다. 하지만 우리는 SUM(), CAST(), ROUND() 함수를 통해 새로운 값을 만들어냈고 이를 담아낼 필드가 필요하죠. 이때 새로운 필드값을 위한 필드명을 정의해야 하며, AS Keyword를 통해 할 수 있습니다. 

?? AS "new field name": 기존 필드값을 통해 만든 새로운 필드값에 해당하는 필드명을 정한다 
SELECT "OrderID", ROUND(CAST(SUM("UnitPrice" * "Quantity" * (1 - "Discount")) AS NUMERIC), 2) AS Subtotal
FROM Order_Details
GROUP BY "OrderID"
ORDER BY "OrderID";

# OR
SELECT "OrderID", ROUND(SUM("UnitPrice" * "Quantity" * (1 - "Discount"))::NUMERIC, 2) AS Subtotal
FROM Order_Details
GROUP BY "OrderID"
ORDER BY "OrderID";

아래처럼 평균을 구하는 함수 AVG()도 있습니다. 이외에도 COUNT(), MIN(), MAX() 함수 등이 있습니다. 자세한 내용은 Postgresql 튜토리얼 홈페이지를 참고하세요. 

SELECT "ProductName", "UnitPrice"
FROM Products
WHERE "UnitPrice" >
(SELECT AVG("UnitPrice") FROM Products)
Order by "UnitPrice";

아래는 비교적 복잡한 쿼리문입니다. 앞서 살펴봤던 AS Keyword, INNER JOIN, ROUND 함수 뿐만 아니라 BETWEEN AND, EXTRACT(QUARTER FROM) 함수도 등장합니다. 

BETWEEN "something" AND "something": 범위 제한
EXTRACT(QUARTER FROM "date type field"): 날짜 데이터에서 분기 추출 

더 다양한 날짜 및 시간 관련 함수는 Postgresql 공식 홈페이지에서 참고하시기 바랍니다. 

SELECT distinct c."CategoryName", # 중복된 행 제거 
p."ProductName", 
ROUND(SUM(d."UnitPrice" * d."Quantity" * (1 - d."Discount"))::NUMERIC, 2) as ProductSales,
EXTRACT(QUARTER FROM o."ShippedDate") AS ShippedQuarter
FROM Categories AS c
INNER JOIN Products as p ON p."CategoryID"=c."CategoryID"
INNER JOIN Order_Details as d ON d."ProductID"=p."ProductID"
INNER JOIN Orders as o ON o."OrderID"=d."OrderID"
WHERE o."ShippedDate" BETWEEN date('1997-01-01') AND date('1997-12-31')
GROUP BY c."CategoryName",
p."ProductName",
EXTRACT(QUARTER FROM o."ShippedDate")
ORDER BY c."CategoryName",
p."ProductName",
ShippedQuarter;

728x90
반응형