问题描述
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=