【问题标题】:Need some assistance with SQL Queries在 SQL 查询方面需要一些帮助
【发布时间】:2019-11-02 00:33:26
【问题描述】:

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

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

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

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;

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

---显示食品支出的总和(提示:SUM 函数),按工作和按 客户是否在我们的电子邮件列表中。仅显示食品支出总和大于 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;

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

【问题讨论】:

  • 我已删除(显然)未使用的产品的标签。请仅标记您的问题涉及的产品。
  • 样本数据和期望的结果会很有帮助。您在这里似乎有多个问题,这使得问题过于宽泛。

标签: sql oracle


【解决方案1】:

第一次查询可以使用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);

一个问题就足够了。

【讨论】:

    【解决方案2】:

    对于第一季度,您可以通过两种方式组合查询:

    1. 如果您可以在单行的多列中输出结果,则可以使用条件聚合。
    2. 如果您需要将结果保存在不同的行中,您可以在 group by 中包含 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;
    

    对于第二季度,您可以在单个查询中完成,如下所示:

    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; 
    

    【讨论】:

      【解决方案3】:

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

      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;
      

      【讨论】:

        猜你喜欢
        • 2018-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多