首页 > 解决方案 > 在 SQL 中,为什么我不能使用 SELECT 语句中的其他查询来进行计算?

问题描述

这是示例表“test0608”:

product_name     color        amount
Product1         Red             123
Product1         Blue             126
Product2         Blue             103
Product2         Red             NULL
Product2         Red             89
Product1         Red             203

我试图找到所有红色产品而不是蓝色产品。这是我的代码:

        select 
         product_name
         ,sum(case when color = Blue then 1 else 0 end ) as blue_num 
         ,sum(case when color = Red then 1 else 0 end ) as red_num 
         ,(red_num- blue_num) as difference
         
         from test0608   
         group by product_name

但是,我收到错误“未知列“red_num”和“blue_num”,这意味着我不能使用我刚刚在 select 语句中计算的两个总和。为什么?

标签: sqlcolumn-alias

解决方案


请试试这个。blue_num 和 red_num 是这里的别名。所以这里不作为字段使用。

SELECT  product_name
     , SUM(CASE WHEN color = 'Blue' THEN 1 ELSE 0 END) AS blue_num 
     , SUM(CASE WHEN color = 'Red' THEN 1 ELSE 0 END) AS red_num 
     , (SUM(CASE WHEN color = 'Red' THEN 1 ELSE 0 END) - SUM(CASE WHEN color = 'Blue' THEN 1 ELSE 0 END)) AS difference
FROM test0608   
GROUP BY product_name;

使用子查询的替代方式。如果想显示red_num 的正差,则在WHERE子句中使用 red_num >= blue_num 。但是,如果显示所有产品但差为 0,则在t.red_num >= t.blue_num THEN t.red_num - t.blue_num ELSE 0 END差时使用

SELECT t.product_name
     , t.blue_num
     , t.red_num
     , (t.red_num - t.blue_num) AS difference
FROM (SELECT product_name
           , SUM(CASE WHEN color = 'Blue' THEN 1 ELSE 0 END) AS blue_num 
           , SUM(CASE WHEN color = 'Red' THEN 1 ELSE 0 END) AS red_num
      FROM test0608   
      GROUP BY product_name) t;

推荐阅读