按+和对不同阈值进行分组最好在单个查询中

问题描述

假设我有一个包含3列的表格:

A列:Client_ID(不是唯一的,可以出现在多行中)

B列:产品支付的价格

C列:产品(类型)

<div class="container">
    
        <hr>
        <h4>Tittle</h4>

        <div class="row">
            <div class="col-sm-4">
                <a href="" target="_blank"><p><img src="assets/icons8-google-maps-48.png" alt=""> Prettyname
                </p>
                <p class="address">address<br/>
                CP City</p></a>

            </div>

            <div class="col-sm-4">
                <a href="" target="_blank"><p><img src="assets/icons8-google-maps-48.png" alt=""> Prettyname
                </p>
                <p class="address">address<br/>
                    CP City</p></a>

            </div>
            
            <div class="col-sm-4 text-right">
                <ul class="social-links">
                    <li class="scrollimation fade-right d4"><a href=""><i class="fa fa-instagram fa-fw"></i></a></li>
                    <li class="scrollimation fade-right d3"><a href=""><i class="fa fa-facebook fa-fw"></i></a></li>
                </ul>
                <p>Footer copyright</p>
            </div>
            
        </div>
        
    </div>

我想获得6列:

+---+----+------+---+
|   | A  |  B   | C |
+---+----+------+---+
| 1 | 5  | 1200 | 1 | 
| 2 | 12 | 10   | 1 | 
| 3 | 12 | 15   | 1 | 
| 4 | 12 | 1750 | 2 | 
| 5 | 12 | 1250 | 2 | 
| 6 | 18 | 10   | 1 | 
| 7 | 18 | 1500 | 1 | 
| 8 | 18 | 1050 | 2 |
| 9 | 18 | 1050 | 2 |
+---+----+------+---+

Client_ID | Product | Number_of_transactions | Sum_of_transactions | Number_of_transactions_over_1000 | Sum_of_transactions_over_1000

使用Client_ID x产品唯一

我认为第一部分可以通过简单的GROUP BY实现

| Client_ID | Product | Nb_tr | Sum_tr | Nb_tr_1000 | Sum_tr_1000 |
+-----------+---------+-------+--------+------------+-------------+
|         5 |       1 |     1 |   1200 |          1 |        1200 |
|         5 |       2 |     0 |      0 |          0 |           0 |
|        12 |       1 |     2 |     25 |          0 |           0 |
|        12 |       2 |     2 |   3000 |          2 |        3000 |
|        18 |       1 |     2 |   1510 |          1 |        1500 |
|        18 |       2 |     2 |   2100 |          2 |        2100 |
+-----------+---------+-------+--------+------------+-------------+

但是,如何获得Number_of_transactions_over_1000和Sum_of_transactions_over_1000?我知道我可以通过单独的查询(通过添加其中B> 1000 )来获取它们,然后可以将Number_of_transactions和Sum_of_transactions的查询与Number_of_transactions_over_1000和Sum_of_transactions_over_1000的查询一起加入,但是可以在单个查询中完成(带有单个SELECT指令)?

解决方法

注意:这不会推断product_type,但会给出正确的结果。 您的输入数据表在以下查询中被命名为data_p,相应地进行更改。 另请参阅SAS是否支持CASE WHEN操作。[由于没有实时SAS DB,我无法在SAS上对其进行检查,但此SQL足够通用。]

SELECT
  clientId,p_type,SUM(price) as sum_of_tr,COUNT(*) as num_of_tr,SUM(CASE WHEN price>1000 THEN price ELSE 0 END) as sum_of_tr_over_1000,SUM(CASE WHEN price>1000 THEN 1     ELSE 0 END) as num_of_tr_over_1000 
FROM
  data_p
GROUP BY
  clientId,p_type
ORDER BY
 clientId,p_type
,

您正在寻找条件聚合(聚合函数中的CASE WHEN)。

SELECT
  client_id,product,count(*) as nb_tr,sum(price) as sum_tr,count(case when price > 1000 then 1 end) as nb_tr_1000,sum(case when price > 1000 then price end) as sum_tr_1000
from purchases
group by client_id,product
order by client_id,product;
,

即使您的数据中不存在Client_ID x Product所有组合,您的输出也会显示出您想要的结果。例如5 x 2

+---+----+------+---+
|   | A  |  B   | C |
+---+----+------+---+
| 1 | 5  | 1200 | 1 | 

想要

| Client_ID | Product | Nb_tr | Sum_tr | Nb_tr_1000 | Sum_tr_1000 |
+-----------+---------+-------+--------+------------+-------------+
|         5 |       1 |     1 |   1200 |          1 |        1200 |
|         5 |       2 |     0 |      0 |          0 |           0 |

因此,一个重要的临时问题是“ 产品的独特价值从何而来?

在大型数据集中,一个 可能 all {上找到所有可能的product {1}}。但是您可能没有。

确保所有产品的最确定的方法是有一个单独的产品表,但是,与原始表交叉连接的产品表(按client_id分组)可能会产生比期望更大的结果。 在某些SAS程序中,可以使用product_id选项指定要处理的类别组合的单独表。

第二种方法是考虑原始表中的组合 coverage 。即分别选择并交叉显示在原始表格中的层次结构级别的不同值,即客户覆盖率x产品覆盖率。在一些较小或分层的数据集中,可能不会展示潜在客户和产品的全部范围。

示例(覆盖率):

classdata=