MariaDB: сортировка с помощью SUM, Group, DESC не работает, как я планировал. (тренируется с Headfirst SQL) - PullRequest
0 голосов
/ 05 мая 2019

У меня есть список продуктов, которые продаются, и я пытаюсь составить список SUM, отсортированный по продавцу и сумме цены, но он не работает так, как написано в книге.

Я читаю HeadFirst SQL (который касается MySQL), и то, что я пытаюсь, не работает как заявления, написанные в книге. Я тренируюсь с MariaDB, но MariaDB и MySQL почти одинаковы, так что я думаю, что проблема не приходит из-за этой разницы, и я не могу понять, почему это происходит.

This is information about COLUMNS


MariaDB [headfirstdrinks]> DESC movie_table;
+-----------+--------------+------+-----+----------+----------------+
| Field     | Type         | Null | Key | Default  | Extra          |
+-----------+--------------+------+-----+----------+----------------+
| movie_id  | int(11)      | NO   | PRI | NULL     | auto_increment |
| title     | varchar(50)  | NO   |     | NULL     |                |
| rating    | varchar(2)   | NO   |     | NULL     |                |
| category  | varchar(15)  | NO   |     | misc     |                |
| purchased | date         | NO   |     | NULL     |                |
| seller    | varchar(15)  | NO   |     | In Stock |                |
| price     | decimal(5,2) | NO   |     | 0.00     |                |
+-----------+--------------+------+-----+----------+----------------+
And This is Table

MariaDB [headfirstdrinks]> SELECT title, seller, price FROM movie_table;
+------------------------------+----------+-------+
| title                        | seller   | price |
+------------------------------+----------+-------+
| Monsters, inc.               | Jessie   |  2.00 |
| The Godfather                | Jessie   | 15.00 |
| Gone with the Wind           | Jessie   | 11.00 |
| American Pie                 | Jessie   |  8.00 |
| Nightmare on Eim Street      | Jessie   |  5.00 |
| Casablanca                   | Nicole   | 11.00 |
| Big Adventure                | Nicole   |  2.00 |
| Greg:The Untold Story        | Nicole   |  8.00 |
| Mad Clowns                   | In Stock | 11.00 |
| Paraskavendekariaphobia      | Brown    |  5.00 |
| Rat named Darcy,A            | Brown    |  2.00 |
| End of the Line              | Brown    |  8.00 |
| Shark Bait                   | Brown    |  2.00 |
| Angry Pirate                 | Brown    | 15.00 |
| Potentially Habitable Planet | Brown    |  5.00 |
+------------------------------+----------+-------+
SELECT seller, SUM(price) FROM movie_table ORDER BY SUM(price) DESC, seller;
+--------+------------+
| seller | SUM(price) |
+--------+------------+
| Jessie |     110.00 |
+--------+------------+
\\There's no Nicole and Brown (i don't know why,
\\but seems like this is caused because SUM is a function ),
\\so i tried "GROUP BY"

SELECT seller, SUM(price) FROM movie_table GROUP BY seller ORDER BY price DESC;
+----------+------------+
| seller   | SUM(price) |
+----------+------------+
| In Stock |      11.00 |
| Nicole   |      21.00 |
| Brown    |      37.00 |
| Jessie   |      41.00 |
+----------+------------+
\\this is ascending even though i put DESC so i put ASC

SELECT seller, SUM(price) FROM movie_table GROUP BY seller ORDER BY price ASC, seller;
+----------+------------+
| seller   | SUM(price) |
+----------+------------+
| Jessie   |      41.00 |
| Brown    |      37.00 |
| In Stock |      11.00 |
| Nicole   |      21.00 |
+----------+------------+
\\and this is even not Ascending , as i see 'In Stock' upper than 'Nicole'

что я сделал не так ???

Ответы [ 3 ]

1 голос
/ 05 мая 2019

вы пропустили группу по

SELECT seller, SUM(price) 
FROM movie_table 
GROUP BY seller
ORDER BY SUM(price) DESC, seller;

и без группы, используя версию mysql, предшествующую 5.7, я возвратил только одну строку со случайным значением для продавца (для других версий по умолчанию выдается ошибка)

для других запросов (в неправильном порядке) вы должны использовать правильное имя столбца (сумма (цена)) или псевдоним для имени столбца

SELECT seller, SUM(price) my_col
FROM movie_table 
GROUP BY seller ORDER BY my_col ASC, seller;

или

SELECT seller, SUM(price) my_col
FROM movie_table 
GROUP BY seller ORDER BY SUM(price ASC, seller;
0 голосов
/ 05 мая 2019

Этот запрос:

SELECT seller, SUM(price) FROM movie_table ORDER BY SUM(price) DESC, seller;

является логически неправильным, потому что вы не указываете столбец, по которому вы можете сгруппировать, чтобы получить сумму, поэтому вы получаете всю сумму таблицы с именем, выбранным MySQL,В этих запросах:

SELECT seller, SUM(price) FROM movie_table GROUP BY seller ORDER BY price DESC;
SELECT seller, SUM(price) FROM movie_table GROUP BY seller ORDER BY price ASC, seller;

вы делаете группировку, но вы order by неагрегированный столбец.Вы можете использовать псевдонимы сумм, подобных этим, а затем заказать их:

SELECT seller, SUM(price) as price FROM movie_table GROUP BY seller ORDER BY price DESC;
SELECT seller, SUM(price) as price FROM movie_table GROUP BY seller ORDER BY price ASC, seller;
0 голосов
/ 05 мая 2019

Возможно, вы захотите использовать псевдоним:

SELECT seller, SUM(price) AS price
FROM movie_table 
GROUP BY seller 
ORDER BY price ASC, seller;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...