Суммировать повторяющиеся столбцы в таблице - PullRequest
2 голосов
/ 15 марта 2012

Я использую базу данных издателей и делаю запрос, чтобы перечислить название и количество книг, проданных в любом книжном магазине, для каждого автора, который продал любые книги в магазине Bookbeat.

Когда я делаю этот запрос

SELECT DISTINCT au_lname, au_fname, qty
from authors
JOIN titleauthor on titleauthor.au_id = authors.au_id
JOIN titles on titles.title_id = titleauthor.title_id
JOIN sales on sales.title_id = titles.title_id
JOIN stores on stores.stor_id = sales.stor_id
--WHERE stor_name LIKE 'Bookbeat' 

Я получаю этот результат

Bennet  Abraham 5
Bennet  Abraham 10
Blotchet-Halls  Reginald    20
Carson  Cheryl  30
DeFrance    Michel  15
DeFrance    Michel  25
del Castillo    Innes   10
Dull    Ann 50
Green   Marjorie    5
Green   Marjorie    10
Green   Marjorie    35
Gringlesby  Burt    20
Hunter  Sheryl  50
Karsen  Livia   20
Locksley    Charlene    25
MacFeather  Stearns 20
MacFeather  Stearns 25
O'Leary Michael 20
O'Leary Michael 25
Panteley    Sylvia  40
Ringer  Albert  3
Ringer  Albert  10
Ringer  Albert  20
Ringer  Albert  25
Ringer  Albert  75
Ringer  Anne    3
Ringer  Anne    10
Ringer  Anne    15
Ringer  Anne    20
Ringer  Anne    25
Ringer  Anne    75
Straight    Dean    15
White   Johnson 15
Yokomoto    Akiko   20

Но когда я раскомментирую, где я получаю это

Bennet  Abraham 10
Carson  Cheryl  30
DeFrance    Michel  15
Green   Marjorie    10
MacFeather  Stearns 25
O'Leary Michael 25
Ringer  Anne    15

Я думаю, что я ищу, чтобы суммировать дубликаты, чтобы я получил правильный ответ. Таким образом, фактическое количество Беннет Авраама будет 15.

1 Ответ

2 голосов
/ 15 марта 2012

Вот один из способов (вы всегда должны включать PK в GROUP BY, поскольку имена авторов не гарантированно уникальны)

SELECT au_lname, 
       au_fname, 
       SUM(qty) AS qty 
FROM   authors 
       JOIN titleauthor 
         ON titleauthor.au_id = authors.au_id 
       JOIN titles 
         ON titles.title_id = titleauthor.title_id 
       JOIN sales 
         ON sales.title_id = titles.title_id 
       JOIN stores 
         ON stores.stor_id = sales.stor_id 
GROUP  BY  authors.au_id,
           au_lname, 
           au_fname 
HAVING MAX(CASE 
             WHEN stor_name = 'Bookbeat' THEN 1 
           END) = 1 

Или другой, который избегает суммирования авторов, которые не соответствуют требованиям, но выполняют присоединения дважды.

;WITH CTE As
(
SELECT     authors.au_id,
           au_lname, 
           au_fname,
           stor_name,
           qty          
FROM   authors 
       JOIN titleauthor 
         ON titleauthor.au_id = authors.au_id 
       JOIN titles 
         ON titles.title_id = titleauthor.title_id 
       JOIN sales 
         ON sales.title_id = titles.title_id 
       JOIN stores 
         ON stores.stor_id = sales.stor_id 
)
SELECT au_lname, 
       au_fname, 
       SUM(qty) AS qty 
FROM   CTE 
WHERE au_id IN (SELECT au_id FROM CTE WHERE stor_name = 'Bookbeat')
GROUP  BY  au_id,
           au_lname, 
           au_fname 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...