반응형
MySQL: 인라인 하위 쿼리에서 여러 열 반환
매출액에 대한 월별 요약을 반환하는 SQL 스테이트먼트를 만들고 있습니다.
요약에는 날짜, 총 매출 수 및 총 매출액에 대한 몇 가지 간단한 열이 나열됩니다.
단, 이 칼럼들 외에 지출액에 따라 베스트 커스터머의 달을 나열하는 3개의 칼럼을 추가해 주십시오.이러한 컬럼의 경우 ID, 이름 및 소비 금액을 반환할 수 있는 인라인 서브쿼리가 필요합니다.
현재 작업에서는 인라인을 사용하고 있습니다.SELECT
단, 이러한 구현 방법에 대한 제 지식에 따르면 인라인 스테이트먼트당 하나의 열과 행만 반환할 수 있습니다.
시나리오에서는 물론 3개의 독립된 인라인 스테이트먼트를 작성할 수 있지만, 실용적이지 않은 것처럼 보이는 것 외에 쿼리 시간이 필요 이상으로 길어집니다.
SELECT
DATE_FORMAT(OrderDate,'%M %Y') AS OrderMonth,
COUNT(OrderID) AS TotalOrders,
SUM(OrderTotal) AS TotalAmount,
(SELECT SUM(OrderTotal) FROM Orders WHERE DATE_FORMAT(OrderDate,'%M %Y') = OrderMonth GROUP BY OrderCustomerFK ORDER BY SUM(OrderTotal) DESC LIMIT 1) AS TotalCustomerAmount,
(SELECT OrderCustomerFK FROM Orders WHERE DATE_FORMAT(OrderDate,'%M %Y') = OrderMonth GROUP BY OrderCustomerFK ORDER BY SUM(OrderTotal) DESC LIMIT 1) AS CustomerID,
(SELECT CustomerName FROM Orders INNER JOIN Customers ON OrderCustomerFK = CustomerID WHERE DATE_FORMAT(OrderDate,'%M %Y') = OrderMonth GROUP BY OrderCustomerFK ORDER BY SUM(OrderTotal) DESC LIMIT 1) AS CustomerName
FROM Orders
GROUP BY DATE_FORMAT(OrderDate,'%m%y')
ORDER BY DATE_FORMAT(OrderDate,'%y%m') DESC
어떻게 하면 이 쿼리를 더 잘 구성할 수 있을까요?
풀답변수
Dave Barkers 솔루션을 약간 수정한 후, 향후 도움을 필요로 하는 사용자를 위한 최종 버전을 준비했습니다.
Dave Barker의 솔루션은 고객의 세부 사항에 완벽하게 대응했지만, 단순화된 Total Sales 및 Total Sales Mount 컬럼에 엉뚱한 수치가 표시됩니다.
SELECT
Y.OrderMonth, Y.TotalOrders, Y.TotalAmount,
Z.OrdCustFK, Z.CustCompany, Z.CustOrdTotal, Z.CustSalesTotal
FROM
(SELECT
OrdDate,
DATE_FORMAT(OrdDate,'%M %Y') AS OrderMonth,
COUNT(OrderID) AS TotalOrders,
SUM(OrdGrandTotal) AS TotalAmount
FROM Orders
WHERE OrdConfirmed = 1
GROUP BY DATE_FORMAT(OrdDate,'%m%y')
ORDER BY DATE_FORMAT(OrdDate,'%Y%m') DESC)
Y INNER JOIN
(SELECT
DATE_FORMAT(OrdDate,'%M %Y') AS CustMonth,
OrdCustFK,
CustCompany,
COUNT(OrderID) AS CustOrdTotal,
SUM(OrdGrandTotal) AS CustSalesTotal
FROM Orders INNER JOIN CustomerDetails ON OrdCustFK = CustomerID
WHERE OrdConfirmed = 1
GROUP BY DATE_FORMAT(OrdDate,'%m%y'), OrdCustFK
ORDER BY SUM(OrdGrandTotal) DESC)
Z ON Z.CustMonth = Y.OrderMonth
GROUP BY DATE_FORMAT(OrdDate,'%Y%m')
ORDER BY DATE_FORMAT(OrdDate,'%Y%m') DESC
인라인 SQL을 내부 조인 쿼리로 이동합니다.그러니까...
SELECT DATE_FORMAT(OrderDate,'%M %Y') AS OrderMonth, COUNT(OrderID) AS TotalOrders, SUM(OrderTotal) AS TotalAmount, Z.OrderCustomerFK, Z.CustomerName, z.OrderTotal as CustomerTotal
FROM Orders
INNER JOIN (SELECT DATE_FORMAT(OrderDate,'%M %Y') as Mon, OrderCustomerFK, CustomerName, SUM(OrderTotal) as OrderTotal
FROM Orders
GROUP BY DATE_FORMAT(OrderDate,'%M %Y'), OrderCustomerFK, CustomerName ORDER BY SUM(OrderTotal) DESC LIMIT 1) Z
ON Z.Mon = DATE_FORMAT(OrderDate,'%M %Y')
GROUP BY DATE_FORMAT(OrderDate,'%m%y'), Z.OrderCustomerFK, Z.CustomerName
ORDER BY DATE_FORMAT(OrderDate,'%y%m') DESC
다음과 같은 작업을 수행할 수도 있습니다.
SELECT
a.`y`,
( SELECT @c:=NULL ) AS `temp`,
( SELECT @d:=NULL ) AS `temp`,
( SELECT
CONCAT(@c:=b.`c`, @d:=b.`d`)
FROM `b`
ORDER BY b.`uid`
LIMIT 1 ) AS `temp`,
@c as c,
@d as d
FROM `a`
한 번 시도해 보세요.
SELECT CONCAT(o.order_month, ' ', o.order_year),
o.total_orders,
o.total_amount,
x.sum_order_total,
x.ordercustomerfk,
x.customername
FROM (SELECT MONTH(t.orderdate) AS order_month,
YEAR(t.orderdate) AS order_year
COUNT(t.orderid) AS total_orders,
SUM(t.ordertotal) AS total_amount
FROM ORDERS t
GROUP BY MONTH(t.orderdate), YEAR(t.orderdate)) o
JOIN (SELECT MONTH(t.orderdate) AS ordermonth,
YEAR(t.orderdate) AS orderyear
SUM(t.ordertotal) 'sum_order_total',
t.ordercustomerfk,
c.customername
FROM ORDERS t
JOIN CUSTOMERS c ON c.customerid = o.ordercustomerfk
GROUP BY t.ordercustomerfk, MONTH(t.orderdate), YEAR(t.orderdate)) x ON x.order_month = o.order_month
AND x.order_year = o.order_year
ORDER BY o.order_year DESC, o.order_month DESC
언급URL : https://stackoverflow.com/questions/1760817/mysql-returning-multiple-columns-from-an-in-line-subquery
반응형
'source' 카테고리의 다른 글
Symfony 2의 CSS 파일 자산 경로 (0) | 2022.10.02 |
---|---|
디폴트로는 index.dload는 로드되지 않음 (0) | 2022.10.02 |
들여쓰기 오류: unindentent가 외부 들여쓰기 수준과 일치하지 않습니다. (0) | 2022.10.02 |
이유, 치명적인 오류: 클래스 'PHPUnit_Framework_'Test Case를 찾을 수 없습니다. (0) | 2022.10.02 |
정규화된 UTF-8이란 무엇입니까? (0) | 2022.10.02 |