Показать всю сумму и подсчет без использования группы по - PullRequest
0 голосов
/ 01 августа 2020

Я хочу получить имена клиентов, общее количество заказов (сколько раз они заказывают продукты) и общую сумму, которую они потратили за время жизни. Выполните один запрос БЕЗ операторов Join, group by, having. Показывать только клиентов, у которых есть хотя бы один заказ.

Вот моя база данных

Customer-    CustomerID| CustomerName   SalesOrder- SalesOrderID | CustomerID | SaleTotal
             100000    |  John                        1001       |   100000   |  2000
             200000    |  Jane                        1002       |   100000   |  3000  
             300000    |  Sean                        1003       |   200000   |  5000

Когда я запрашиваю

SELECT CustomerName,count(*) AS Total_Orders,sum(SaleTotal) AS SaleTotal                           
FROM Customer C,SalesOrderHeader SH WHERE C.CustomerID=SH.CustomerID;

, отображается только одна строка. Ответ, который я хочу:

CustomerName | Total_Orders | SaleTotal
John            2               5000
Jane            1               5000

Я новичок в mysql. Так кто-нибудь здесь знает, как это сделать?

Ответы [ 3 ]

1 голос
/ 01 августа 2020

Если вы должны сделать это без join s и group by, то самый простой подход - использовать коррелированные подзапросы:

select *
from (
    select
        c.customerName,
        (
            select count(*) 
            from salesOrder so 
            where so.customerID = c.customerID
        ) totalOrders,
        (
            select sum(salesTotal) 
            from salesOrder so 
            where so.customerID = c.customerID
        ) saleTotal
    from customer c
) t
where totalOrders > 0

Обратите внимание, что этот запрос явно неоптимален, потому что он сканирует salesOrder таблица дважды, тогда как одного сканирования будет достаточно. Лучше написать это:

select c.customerName, count(*) totalOrders, sum(salesTotal) saleTotal
from customer c
inner join saleOrder so on so.customerID = c.customerID
group by c.customerID, c.customerName

Здесь нет необходимости в предложении having - inner join отфильтровывает клиентов, у которых еще нет заказов.

0 голосов
/ 01 августа 2020

Вы должны использовать запрос ниже. Вы не можете этого добиться без join и group by

SELECT CustomerName,count(*) AS Total_Orders,sum(SaleTotal) AS SaleTotal                           
FROM Customer C,SalesOrderHeader SH WHERE C.CustomerID=SH.CustomerID
group by;
0 голосов
/ 01 августа 2020

Использовать агрегирование. . . и правильный синтаксис join:

SELECT CustomerName, COUNT(*) AS Total_Orders, SUM(SaleTotal) AS SaleTotal                           
FROM Customer C JOIN
     SalesOrderHeader SH 
     ON C.CustomerID = SH.CustomerID
GROUP BY CustomerName;

Ваш запрос завершится ошибкой практически в любой базе данных, включая более новые версии MySQL. Вы смешали агрегированные столбцы и неагрегированные столбцы в SELECT. Неагрегированные должны быть в GROUP BY.

Никогда используйте запятые в предложении FROM. Всегда использовать правильный, явный, стандартный , читаемый JOIN синтаксис.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...