2013-12-13 20 views
5

Czy ktoś wie dlaczego nie jestem w stanie do grupy TotalSales w tym zapytaniu, a jeśli tak, w jaki sposób można to naprawić:Klauzula GROUP BY z alisem?

select coalesce(Author_ID, 'All Authors') as Author_ID 
, case when Author_ID is null then ' ' else coalesce(Book_ID, 'All Books') end as Book_ID 
, TotalQuantity 
, coalesce(TotalSales, 'No Sales') as TotalSales 
from ( 
    select author_id as Author_ID 
      , book_id as Book_ID 
      , sum(quantity) as TotalQuantity 
      , sum(quantity * order_price) as TotalSales 
      from a_bkinfo.book_authors 
      join a_bkorders.order_details using (book_id) 
      where author_sequence = 1   
      group by Author_id, Book_ID, TotalSales with rollup 
    ) tbl; 

Chciałem to „nie sprzedaży” pod TotalSales gdy autor nie prowadzi sprzedaży książek. Oto zaktualizowana wersja. Nie jestem pewien, że to jest poprawne, ale mam wyjście, które wydaje się rozwiązać problem. Oto ona:

select coalesce(Author_ID, 'All Authors') as Author_ID 
, case when Author_ID is null then ' ' else coalesce(Book_ID, 'All Books') end as Book_ID 
, NumOrders 
, coalesce(TotalSales, 'No Sales') as TotalSales 
    from (select author_id as Author_ID 
      , book_id as Book_ID 
      , count(Distinct order_id) AS NumOrders 
      ,(Select sum(quantity * order_price) from a_bkorders.order_details) as TotalSales 
     from a_bkorders.order_headers 
     join a_bkorders.order_details using (order_id) 
     join a_bkinfo.book_authors using (book_id) 
     where author_sequence = 1   
     group by Author_ID, Book_ID, TotalSales with rollup) tbl; 
+2

Wygląda na to, że nie musisz uwzględniać opcji 'TotalSales' w' GROUP BY'. Patrząc na twoje zapytanie, to po prostu nie ma sensu. Po prostu zrzuć go z wewnętrznego wyboru. – peterm

+0

Czy możesz wyjaśnić dalej? Mam problem z utworzeniem podzapytania. Czy powinienem umieścić to zapytanie wewnątrz zewnętrznego zapytania? – user3098749

Odpowiedz

1

UPDATED2

  1. Wygląda na to, że nie muszą zawierać TotalSales w GROUP BY. Patrząc na twoje zapytanie, to po prostu nie ma sensu. Po prostu zrzuć go z wewnętrznego wyboru.

  2. Aby to książki, które nie zostały sprzedane trzeba użyć zewnętrznej przyłączyć

Mając na uwadze powyższe zapytanie może wyglądać wyjście

SELECT COALESCE(author_id, 'All Authors') author_id 
    , COALESCE(book_id, IF(author_id IS NULL, 'All Books', 'Subtotal')) book_id 
    , COALESCE(total_quantity, 'No books') total_quantity 
    , COALESCE(total_sales, 'No Sales') total_sales 
FROM 
( 
SELECT author_id 
     , b.book_id 
     , SUM(quantity) total_quantity 
     , SUM(quantity * order_price) total_sales 
    FROM book_authors b LEFT JOIN order_details d 
    ON b.book_id = d.book_id 
    WHERE author_sequence = 1   
    GROUP BY Author_id, Book_ID WITH ROLLUP -- you don't need TotalSales here 
) q; 

Sample:

 
+-------------+-----------+----------------+-------------+ 
| author_id | book_id | total_quantity | total_sales | 
+-------------+-----------+----------------+-------------+ 
| 1   | 1   | 12    | 278.50  | 
| 1   | 3   | No books  | No Sales | 
| 1   | Subtotal | 12    | 278.50  | 
| 3   | 2   | 5    | 75.75  | 
| 3   | Subtotal | 5    | 75.75  | 
| All Authors | All Books | 17    | 354.25  | 
+-------------+-----------+----------------+-------------+ 

Oto SQLFiddle demo

+0

Ale jak mogę grupować TotalSales chociaż. Muszę dołączyć komunikat "brak zamówień" w ramach TotalSales, w którym nie ma zamówień na książkę. – user3098749

+0

Odpowiedziałeś na moje pytanie. Przyglądałem się przykładowym wynikom, które dostarczyłeś i dałeś mi dokładnie to, czego potrzebowałem. Jest to dla mnie wciąż nowe, dlatego uczę się po drodze. Dziękujemy i problem rozwiązany! – user3098749

+0

Jeśli potrzebuję "anon" dla żadnego autora pod Author_ID i "bez książek" dla żadnych książek w Book_ID. Jak mogę to włączyć? Myślę, że zwariowałem. – user3098749

0

To jak to działa (na zamówienie):

  1. FROM klauzula
  2. WHERE klauzula
  3. GROUP BY klauzula
  4. HAVING klauzula
  5. SELECT klauzula
  6. ORDER BY klauzula

W tym przypadku alias stworzony na 5 etapie kupić gdzie pracuje na 2 kroku. Musisz utworzyć podzapytanie z wyliczonym TotalSales, a następnie użyć GROUP w zapytaniu zewnętrznym.

+0

Nie wiem dokładnie, jak pogrupować wiele aliasów. Jestem początkujący i nie jestem pewien, czy powinienem dodać kolejną podkwerendę w klauzuli where lub czy powinienem mieć inne podkwerendy w klauzuli from. Czy mógłbyś prosić o opracowanie z demonstracją? – user3098749