【发布时间】:2021-10-12 06:05:18
【问题描述】:
我有一个包含超过 500 万客户的表,其中包含历史活动数据,如下例所示:
| Customer ID | PART_ID | Activity |
|---|---|---|
| 12345 | 202012 | 2 |
| 12345 | 202101 | 0 |
| 12345 | 202102 | 5 |
我想将此数据转换为多列;行中的客户、列中的日期及其各自的活动信息。
我编写了下面的代码,但不是为单个客户创建单行,而是客户重复,我得到一个这样的表:
| Customer ID | 202012 | 202101 | 202102 |
|---|---|---|---|
| 12345 | 1 | 0 | 0 |
| 12345 | 0 | 0 | 0 |
| 12345 | 0 | 0 | 1 |
代替:
| Customer ID | 202012 | 202101 | 202102 |
|---|---|---|---|
| 12345 | 1 | 0 | 1 |
我做错了什么?
SELECT *
FROM
(
SELECT CUST_ID, RULLED_PROFIT_CENTER,
CASE WHEN PART_ID = 202012 AND ACTIVITY > 0 THEN 1 ELSE 0 END AS ARA_20,
CASE WHEN PART_ID = 202101 AND ACTIVITY > 0 THEN 1 ELSE 0 END AS OCA_21,
CASE WHEN PART_ID = 202102 AND ACTIVITY > 0 THEN 1 ELSE 0 END AS SUB_21,
CASE WHEN PART_ID = 202103 AND ACTIVITY > 0 THEN 1 ELSE 0 END AS MAR_21,
CASE WHEN PART_ID = 202104 AND ACTIVITY > 0 THEN 1 ELSE 0 END AS NIS_21,
CASE WHEN PART_ID = 202105 AND ACTIVITY > 0 THEN 1 ELSE 0 END AS MAY_21,
CASE WHEN PART_ID = 202106 AND ACTIVITY > 0 THEN 1 ELSE 0 END AS HAZ_21,
CASE WHEN PART_ID = 202107 AND ACTIVITY > 0 THEN 1 ELSE 0 END AS TEM_21,
CASE WHEN PART_ID = 202108 AND ACTIVITY > 0 THEN 1 ELSE 0 END AS AGU_21,
CASE WHEN PART_ID = 202109 AND ACTIVITY > 0 THEN 1 ELSE 0 END AS EYL_21
FROM ACTIVITY
WHERE RULLED_PROFIT_CENTER IN (108, 103, 170)
GROUP BY CUST_ID, RULLED_PROFIT_CENTER
)
WHERE ARA_20 + OCA_21 + SUB_21 + MAR_21 + NIS_21 + MAY_21 +
HAZ_21 + TEM_21 + AGU_21 + EYL_21 > 0
【问题讨论】:
-
您按两件事进行分组,
CUST_ID和RULLED_PROFIT_CENTER,因此您将获得每个客户的多个列。RULLED_PROFIT_CENTER是什么? -
RULLED_PROFIT_CENTER 是特定于客户的,客户只能有一个值。您也可以将其从查询中删除。
-
SUM / COUNT / MAX 聚合缺失。例如
MAX (CASE WHEN PART_ID = 202012 AND ACTIVITY > 0 THEN 1 ELSE 0 END) AS ARA_20 -
您使用的是哪种 DBMS 产品? “SQL”只是所有关系数据库都使用的一种查询语言,而不是特定数据库产品的名称。请为您使用的数据库产品添加tag。 Why should I tag my DBMS
-
感谢您的反馈。我正在使用 DBeaver DMBS,也作为标签添加。