Объединение двух производных таблиц в sql - PullRequest
0 голосов
/ 11 апреля 2020

Я уже некоторое время занимаюсь проблемами соединения и думаю, что мне нужна помощь. Я изучаю базу данных Northwind, чтобы немного попрактиковаться, и я изо всех сил пытаюсь соединить две производные таблицы я получаю ошибку «таблица northwind.allorders не существует», и это код;

select cgroups.customergroup,count(*) as totalingroup, (cgroups.customergroup/totalingroup) as percentage
from 

(select customerid,companyname,totalamount,
case when totalamount    between 0 and 1000 then 'low'
     when totalamount    between 1000 and 5000 then 'medium'
     when totalamount    between 5000 and 10000 then 'high'
     when totalamount >=   10000 then 'very high' end as customergroup
     from allorders
     order by customerid) as cgroups

    join(select c.customerid,c.companyname, sum(od.quantity*od.unitprice) as totalamount
from customers as c
join orders as o
on o.customerid=c.customerid
join `order details` as od on od.orderid=o.orderid
where cast(o.orderdate as date)>= '19960101' and cast(o.orderdate as date)<'19970101'
group by customerid) as allorders on allorders.customerid=cgroups.customerid
group by customergroup
order by totalingroup desc;

В основном я хочу сгруппировать клиентов по их расходам в 1996 году как низкие, средние, высокие и очень высокий, а затем посмотреть, сколько клиентов в каждой группе и процент этих групп. Но mysql выдает ошибку «таблица northwind.allorders не существует», когда я выполняю приведенный выше код. Может кто-нибудь сказать мне, где я ошибаюсь? Спасибо за ваше время.

1 Ответ

0 голосов
/ 11 апреля 2020

Я думаю, что вы пытаетесь что-то вроде этого:

select (case when ct.totalamount < 1000 then 'low'
             when ct.totalamount < 5000 then 'medium'
             when ct.totalamount < 10000 then 'high'
             else 'very high' 
        end) as customergroup,
       count(*),
       count(*) / sum(count(*)) over () as ratio
from (select c.customerid, c.companyname,
             sum(od.quantity * od.unitprice) as totalamount
      from customers c join
           orders o
           on o.customerid = c.customerid join
           `order details` od
           on od.orderid = o.orderid
      where o.orderdate >= '1996-01-01' and o.orderdate < '1997-01-01'
      group by c.customerid, c.companyname
     ) ct
group by ct.customergroup
order by count(*) desc;

Ваш запрос немного беспорядок. Я бы порекомендовал при написании запросов начинать с форматирования кода, чтобы можно было следовать за ним.

Затем:

  • Уточните все ссылки на столбцы, чтобы было ясно, откуда они берутся.
  • Убедитесь, что клавиши GROUP BY и SELECT совпадают.
  • Не вижу смысла преобразовывать orderdate в date для сравнения.
  • В выражениях case условия соответствуют в порядке . Это означает, что between не является необходимым - и громоздким, если вы хотите изменить границы.
...