SQL-запрос, чтобы получить столики в ресторане, которые имеют самый большой доход на seat_count - PullRequest
3 голосов
/ 12 июня 2011

У меня есть схема, которая выглядит следующим образом:

 Tables
   table_id
   seat_count

 Orders
   order_id
   table_id
   meal_id

 Meals
   meal_id
   price

Я пытаюсь получить таблицы, которые имеют самый большой доход на seat_count, то есть

 |idTable| |income| |seat_count|
     2        50$        5
     3        60$        4
     4        40$        3
     10       80$        2

Ближайшее, что я получил, былос этим запросом:

 SELECT tables.table_id, 
       SUM(income), 
       tables.seat_count 
FROM   (SELECT tables.table_id, 
               tables.seat_count, 
               COUNT(orders.meal_id) * meals.price AS income 
        FROM   meals 
               INNER JOIN (tables 
                           INNER JOIN orders 
                             ON tables.table_id = orders.table_id) 
                 ON meals.meal_id = orders.meal_id 
        GROUP  BY tables.table_id, 
                  tables.seat_count, 
                  meals.price 
        ORDER  BY COUNT(orders.meal_id) * meals.price DESC) 
GROUP  BY tables.table_id, 
          tables.seat_count 
ORDER  BY SUM(income) DESC  

Но я застрял, он возвращает записи, такие как:

 table_id, income, seat_count
   1         40$     5
   2         30$     5
   4         20$     4

(т.е. с дубликатом seat_counts), и я понятия не имею, как избавиться от него.

1 Ответ

2 голосов
/ 12 июня 2011

Я думаю, что это даст вам то, что вы хотите, хотя если две таблицы имеют одинаковое количество мест и уровень дохода, он покажет обе.Я попробовал это на макете структуры вашей таблицы выше в Access 2003 (именно поэтому он имеет странный синтаксис соединения с квадратными скобками).

select sub1.table_id, sub1.seat_count, sub1.income
from
(
    SELECT Tables.table_id, Tables.seat_count, Sum(Meals.price) AS Income
    FROM (Tables INNER JOIN Orders ON Tables.table_id = Orders.table_id) INNER JOIN Meals ON Orders.meal_id = Meals.meal_id
    GROUP BY Tables.table_id, Tables.seat_count
) sub1
inner join 
(
    select seat_count, max(Income) as Maxincome
    from
    (
        SELECT Tables.table_id, Tables.seat_count, Sum(Meals.price) AS Income
        FROM (Tables INNER JOIN Orders ON Tables.table_id = Orders.table_id) INNER JOIN Meals ON Orders.meal_id = Meals.meal_id
        GROUP BY Tables.table_id, Tables.seat_count
    ) sub
    group by seat_count
) sub2 on (sub1.seat_count = sub2.seat_count and sub1.income = sub2.maxincome);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...