【问题标题】:SQL - trying to find customers by spend group and then grouping those customers by their age and genderSQL - 尝试按支出组查找客户,然后按年龄和性别对这些客户进行分组
【发布时间】:2020-03-12 21:23:23
【问题描述】:

我有以下代码,用于按年龄和性别获取客户数量、支出、交易和利润。我需要添加另一个案例语句,以便我还可以创建支出组。

SELECT 
  gender, 
  agegroup, 
  Count(DISTINCT individual_id), 
  Count(DISTINCT transaction_number), 
  SUM(spend)
FROM 
  (
    SELECT 
      gender, 
      CASE WHEN age < 18 THEN '<18' WHEN age BETWEEN 18 
      AND 24 THEN '18-24' WHEN age BETWEEN 25 
      AND 32 THEN '25-32' WHEN age BETWEEN 33 
      AND 39 THEN '35-39' WHEN age BETWEEN 40 
      AND 46 THEN '40-46' WHEN age BETWEEN 47 
      AND 53 THEN '46-52' WHEN age BETWEEN 54 
      AND 60 THEN '53-58' WHEN age > 60 THEN '61+' END AS AGEGROUP, 
      individual_id,
      transaction_number, 
      spend
    FROM 
      (SELECT 
          gender, 
          age AS age, 
          a.individual_id as individual_id, 
          dollar_value_us as Spend, 
          transaction_number as transaction_number

          FROM transaction_detail_mv a
    join gender_details b on a.individual_id = b.individual_id)
  ) 
GROUP BY 
  gender, 
  agegroup 
ORDER BY 
  gender, 
  agegroup

当前结果:

性别 |年龄组 |计数(DISTINCTINDIVIDUAL_ID)|计数(DISTINCTTRANSACTION_NUMBER)|总和(花费) :----- | :------- | ---------------------------: | --------------------------------: | ---------: F | 46-52 | 1 | 2 | 22 中号 | 18-24 | 1 | 1 | 11 中号 | 40-46 | 2 | 6 | 62

因此,与其过滤整个查询来查找价格介于 10 美元到 23 美元之间的客户数量,如下所示:我只需要一个查询,它将数据划分为支出群组。

select * from (SELECT 
  gender, 
  agegroup, 
  Count(DISTINCT individual_id), 
  Count(DISTINCT transaction_number), 
  SUM(spend) as spend
FROM 
  (
    SELECT 
      gender, 
      CASE WHEN age < 18 THEN '<18' WHEN age BETWEEN 18 
      AND 24 THEN '18-24' WHEN age BETWEEN 25 
      AND 32 THEN '25-32' WHEN age BETWEEN 33 
      AND 39 THEN '35-39' WHEN age BETWEEN 40 
      AND 46 THEN '40-46' WHEN age BETWEEN 47 
      AND 53 THEN '46-52' WHEN age BETWEEN 54 
      AND 60 THEN '53-58' WHEN age > 60 THEN '61+' END AS AGEGROUP, 
      individual_id,
      transaction_number, 
      spend
    FROM 
      (SELECT 
          gender, 
          age AS age, 
          a.individual_id as individual_id, 
          dollar_value_us as Spend, 
          transaction_number as transaction_number

          FROM transaction_detail_mv a
    join gender_details b on a.individual_id = b.individual_id)
  ) 
GROUP BY 
  gender, 
  agegroup 
ORDER BY 
  gender, 
  agegroup) where spend between 10 and 20

我正在寻找的支出群组是:

<$10
$10-$20
$20-$30
$30-$40
$40+

这是小提琴链接:

https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=fe7bbe67da923fde05b5daf8ad991e7c

因此,例如,x 位消费范围在 10 美元到 40 美元之间的客户是 18 到 24 岁年龄段的女性。这就是我最终想要达到的目标。有没有办法将它合并到我当前的查询中??

任何帮助将不胜感激。谢谢!!

【问题讨论】:

  • 请向我们展示您目前得到的结果,以及您期望的结果。设置db<>fiddle 也是一个好主意,这样其他人就可以有效地使用您的数据。
  • @GMB 我添加了小提琴链接。我也没有要显示的结果,但我只想创建一种格式,按消费范围、性别和年龄显示客户数量、交易数量

标签: sql oracle group-by count


【解决方案1】:

大概是这样的:

    SELECT 
      gender, 
      agegroup, 
      Count(DISTINCT individual_id) customer_count, 
            CASE WHEN SUM(spend) < 10 THEN '<$10' WHEN SUM(spend) >= 10 
          AND SUM(spend) < 20 THEN '$10-$20' WHEN SUM(spend) >= 20 
          AND SUM(spend) < 30 THEN '$20-$30' WHEN SUM(spend) >= 30 
          AND SUM(spend) < 40 THEN '$30-$40' WHEN SUM(spend) >= 40 THEN '$40+' END AS spendgroup
    FROM 
      (
        SELECT 
          gender, 
          CASE WHEN age < 18 THEN '<18' WHEN age BETWEEN 18 
          AND 24 THEN '18-24' WHEN age BETWEEN 25 
          AND 32 THEN '25-32' WHEN age BETWEEN 33 
          AND 39 THEN '35-39' WHEN age BETWEEN 40 
          AND 46 THEN '40-46' WHEN age BETWEEN 47 
          AND 53 THEN '46-52' WHEN age BETWEEN 54 
          AND 60 THEN '53-58' WHEN age > 60 THEN '61+' END AS AGEGROUP, 
          individual_id,
          spend
        FROM 
          (SELECT 
              gender, 
              age, 
              a.individual_id, 
              dollar_value_us as Spend
             FROM transaction_detail_mv a
        join gender_details b on a.individual_id = b.individual_id)
      ) 
    GROUP BY 
      gender, 
      agegroup
    ORDER BY 
      gender, 
      agegroup;


输出:

    |GENDER |AGEGROUP   |CUSTOMER_COUNT |SPENDGROUP |
    |F      |46-52      |1              |$20-$30    |   
    |M      |18-24      |1              |$10-$20    |
    |M      |40-46      |2              |$40+       |


DB 小提琴here


【讨论】:

  • 不是真的,我想先为每个客户创建支出群组,然后将他们的年龄组和性别添加到其中,而不是汇总销售额然后创建支出群组。
  • @Somya 请以上述格式分享您的预期输出
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多