MySQL: возврат нескольких столбцов из встроенного подзапроса
Я создаю инструкцию SQL, которая будет возвращать ежемесячную сводку по продажам.
в сводке будут перечислены некоторые простые столбцы для даты, общего количества продаж и общей стоимости продаж.
однако, в дополнение к этим столбцам, я хотел бы включить еще 3, которые будут перечислять месяцы лучший клиент по количеству потраченных. Для этих столбцов мне нужен какой-то встроенный подзапрос, который может возвращать их идентификатор, имя и сумму, которую они потратили.
мой текущее усилие использует встроенный 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, у меня есть окончательная версия для тех, кто в будущем ищет помощь.
решение Дэйва Баркера отлично работало с деталями клиента, однако, оно сделало более простые общие продажи и столбцы общей суммы продажи получают некоторые сумасшедшие цифры.
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
3 ответов:
переместите встроенный 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 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
вы также можете сделать что-то вроде:
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`
Comments