[英]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,您可以通过两种方式组合查询:
任何一种解决方案都比单独查询更有效,因为您现在查询表一次而不是两次。
对于第一个选项,这看起来像:
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.