【问题标题】:GROUP BY clause with alias?带有别名的 GROUP BY 子句?
【发布时间】:2014-01-01 00:22:49
【问题描述】:

有谁知道为什么我无法在此查询中对TotalSales 进行分组,如果可以,我该如何解决:

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;

当作者没有图书销售时,我想在 TotalSales 下包含“无销售”。这是更新的版本。我不肯定这是正确的,但我确实有输出似乎可以解决问题。这里是:

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;

【问题讨论】:

  • 看起来您不需要在GROUP BY 中包含TotalSales。查看您的查询,这没有任何意义。只需从内部选择中删除它即可。
  • 您能进一步解释一下吗?我在创建子查询时遇到问题。我应该将此查询放在外部查询中吗??

标签: mysql group-by alias


【解决方案1】:

更新2

  1. 您似乎不需要在 GROUP BY 中包含 TotalSales。查看您的查询,这没有任何意义。只需将其从内部选择中删除即可。

  2. 要包含尚未售出的书籍,您必须使用外连接

话虽如此,您的查询可能看起来像

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;

样本输出:

+-------------+------------+----------------+------ --------+ |作者_id | book_id |总量 |总销售额 | +-------------+------------+----------------+------ --------+ | 1 | 1 | 12 | 278.50 | | 1 | 3 |没有书|没有销售 | | 1 |小计 | 12 | 278.50 | | 3 | 2 | 5 | 75.75 | | 3 |小计 | 5 | 75.75 | |所有作者 |所有书籍 | 17 | 354.25 | +-------------+------------+----------------+------ --------+

这里是SQLFiddle演示

【讨论】:

  • 但是我怎么能对 TotalSales 进行分组。我需要在 TotalSales 下添加一条消息,说明“没有订单”,其中没有图书订单。
  • 你回答了我的问题。我看了一些提供的示例输出,你给了我我需要的东西。这对我来说仍然是新的,所以我一直在学习。谢谢你,问题解决了!
  • 如果我在 Author_ID 下没有作者需要“anon”,在 Book_ID 下没有书籍需要“no books”。我怎么能把它结合起来?我想我快疯了。
【解决方案2】:

这就是它的工作原理(顺序):

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

在这种情况下,您的别名是在 5 步上创建的,请购买 where works on 2 step。您需要使用计算出的TotalSales 创建子查询,然后在外部查询中使用GROUP

【讨论】:

  • 不确定如何对多个别名进行分组。我是初学者,不确定是否应该在 where 子句中添加另一个子查询,或者是否应该在 from 子句中添加另一个子查询。能否请您详细说明一下?
猜你喜欢
  • 1970-01-01
  • 2013-01-27
  • 2021-06-06
  • 2014-08-28
  • 2014-09-11
  • 1970-01-01
  • 2012-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多