繁体   English   中英

在 SQL 查询方面需要一些帮助

[英]Need some assistance with SQL Queries

我目前正在使用 OracleSQL 处理两个不同的查询问题,我需要一些帮助。

Q1。 在这里,两个查询都可以完美地分开工作。 但是,我需要将它们放在一个表格/图表中,而不是有两个单独的表格/图表。 我错过了什么/我需要做什么来合并两者? 主要区别是“WHERE Email_List=”

---显示客户数量和平均总支出,按在/不在我们的 email 列表中的客户细分。

SELECT COUNT(DISTINCT Customer_Number) Cust_No_w_Email
      ,AVG(Total_Spending) Avg_Spend_w_Email  
FROM CUST_FILE
WHERE Email_List=1;

SELECT COUNT(DISTINCT Customer_Number) Cust_No_wo_Email
      ,AVG(Total_Spending) Avg_Spend_wo_Email
FROM CUST_FILE
WHERE Email_List=0;

Q2。 与上面的类似,下面的模板是我能得到的最接近的模板......

---显示食品支出的总和(提示:SUM 函数),按工作以及客户是否在我们的 email 列表中进行细分。 仅显示食品支出总和大于 5000 的组。按食品支出总和从高到低对组进行排序。

SELECT Job, Email_List AS W_Email, SUM(Food) AS Food_Exp
FROM CUST_FILE
WHERE Email_List=1
GROUP BY Job, Email_List, Food
HAVING SUM(Food)>5000
ORDER BY Job, Food DESC;

SELECT Job, Email_List AS WO_Email, SUM(Food) AS Food_Exp
FROM CUST_FILE
WHERE Email_List=0
GROUP BY Job, Email_List, Food
HAVING SUM(Food)>5000
ORDER BY Food DESC;

如果你能帮助我,你就是在拯救一个灵魂。 先感谢您!

对于第一个查询,您可以使用GROUP BY

SELECT Email_List,
       COUNT(DISTINCT Customer_Number) as Cust_No_w_Email,
       AVG(Total_Spending) as Avg_Spend_w_Email  
FROM CUST_FILE
WHERE Email_List IN (0, 1);

一个问题就足够了。

对于 Q1,您可以通过两种方式组合查询:

  1. 如果可以将 output 的结果放在单行的多列中,则可以使用条件聚合。
  2. 如果您需要将结果保存在单独的行中,您可以将 email_list 列包含在组中

任何一种解决方案都比单独查询更有效,因为您现在查询表一次而不是两次。

对于第一个选项,这看起来像:

SELECT COUNT(DISTINCT CASE WHEN email_list = 1 THEN customer_number END) cust_no_w_email,
       AVG(CASE WHEN email_list = 1 THEN total_spending END) avg_spend_w_email,
       COUNT(DISTINCT CASE WHEN email_list = 0 THEN customer_number END) cust_no_wo_email,
       AVG(CASE WHEN email_list = 0 THEN total_spending END) avg_spend_wo_email
FROM   cust_file;

对于第二个选项:

SELECT CASE WHEN email_list = 1 THEN 'Y'
            WHEN email_list = 0 THEN 'N'
       END email_present,
     COUNT(DISTINCT customer_number) cust_no_count,
       AVG(total_spending) avg_spend
FROM   cust_file
GROUP BY CASE WHEN email_list = 1 THEN 'Y'
              WHEN email_list = 0 THEN 'N'
         END
ORDER BY CASE WHEN email_list = 1 THEN 'Y'
              WHEN email_list = 0 THEN 'N'
         END;

对于 Q2,您可以在单个查询中执行此操作,如下所示:

SELECT job,
     CASE WHEN email_list = 1 THEN 'Y'
            WHEN email_list = 0 THEN 'N'
       END email_present,
     SUM(food) AS food_exp
FROM   cust_file
GROUP  BY job,
        CASE WHEN email_list = 1 THEN 'Y'
               WHEN email_list = 0 THEN 'N'
          END
HAVING SUM(food) > 5000
ORDER  BY CASE WHEN email_list = 1 THEN 'Y'
               WHEN email_list = 0 THEN 'N'
          END,
          SUM(food) DESC; 

对于第一个问题,您可以使用以下查询 -

SELECT 'customers on list', COUNT(DISTINCT Customer_Number) Cust_No_w_Email
      ,AVG(Total_Spending) Avg_Spend_w_Email  
FROM CUST_FILE
WHERE Email_List = 1
UNION ALL
SELECT 'customers not on list', COUNT(DISTINCT Customer_Number) Cust_No_w_Email
      ,AVG(Total_Spending) Avg_Spend_w_Email  
FROM CUST_FILE
WHERE Email_List = 0

对于第二个问题,您可以尝试以下查询 -

SELECT 'Customer in list', Job, Email_List AS W_Email, SUM(Food) AS Food_Exp
FROM CUST_FILE
WHERE Email_List=1
GROUP BY Job, Email_List
HAVING SUM(Food)>5000
UNION ALL
SELECT 'Customer not in list', Job, Email_List, SUM(Food)
FROM CUST_FILE
WHERE Email_List=0
GROUP BY Job, Email_List
HAVING SUM(Food)>5000
ORDER BY Food_Exp DESC;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM