Как получить данные из нескольких таблиц в SQL - PullRequest
0 голосов
/ 18 февраля 2019
create table customers
    (
    custID int(11) primary key, 
    customerName varchar(50),
    phone varchar(50),
    address varchar(50),
    state varchar(50),
    postalCode varchar(15),
    country varchar(50),
    creditLimit Decimal(10,2)
    );

create table product
(
    productID varchar(15) primary key,
    productName varchar(70),
    productVendor varchar(50),
    productDescription text,
    qtyInStock smallint(6),
    price Decimal(10,2)
);

create table orders
(
    orderNumber int(11) primary key,
    orderDate date,
    requiredDate date,
    shippedDate date,
    status varchar(15),
    comments text,
    custID int(11),
    salesID int(11),
    foreign key(custID) references customers(custID),
    foreign key(salesID) references salespersonnel(employeeID)
);

вот три таблицы, я хочу получить все заказы одного конкретного клиента и их общие потраченные деньги.

У меня есть две записи в таблице заказов и таблице платежей

Таблица платежей: enter image description here

Таблица заказов: enter image description here

Я выполняю этот запрос

select count(p.orderNumber) as 'Total Orders', sum(amount) as 'Amount Spent'
from orders p,
     payments q
where p.custid = q.custid
  and q.custid = 1;

Этот запрос приводит к двойному результату, что означает, что общая сумма расходов должна быть возвращена в сумме 2200, но я получаю 4400, и заказчики размещают всего 2 заказа, но я получаю 4. Пожалуйста, помогите

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Вам необходимо объединить 2 таблицы в столбце ordernumber:

select 
  count(o.orderNumber) as 'Total Orders', 
  sum(p.amount) as 'Amount Spent'
from orders o inner join payment p
on p.ordernumber = o.ordernumber
where o.custid = 1

См. Демоверсию Если вы хотите получить эти суммы для каждого клиента:

select
  o.custid,
  count(o.orderNumber) as 'Total Orders', 
  sum(p.amount) as 'Amount Spent'
from orders o inner join payment p
on p.ordernumber = o.ordernumber
group by o.custid
0 голосов
/ 18 февраля 2019

Вам нужно объединить до присоединения.В противном случае вы получите декартово произведение (и неправильные результаты, как вы видите):

select o.custid, o.Total_Orders, p.Amount_Spent
from (select o.cust_id, count(*) as total_orders
      from orders o
      group by o.custid
     ) o left join 
     (select p.cust_id, sum(amount) as amount_spent
      from payments p
      group by p.cust_id
     ) p
     on p.custid = o.custid ;

Вы можете добавить предложение WHERE для фильтрации результатов.Вы можете сделать это во внешнем запросе или в подзапросах.Последнее лучше с точки зрения производительности.

Примечания:

  • Никогда не используйте запятые в предложении FROM. Всегда используйте правильный, явный, стандартный JOIN синтаксис.
  • Используйте значимые псевдонимы таблиц.p для orders вместо payments просто сбивает с толку.
  • Используйте только буквы, цифры и подчеркивание в псевдонимах столбцов, поэтому их не нужно экранировать.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...