我的表格如下所示:
USER_ID START_DATE END_DATE PRODUCT_ID
1 2015-07-20 2016-07-20 1
1 2003-10-25 2009-01-14 0
2 2007-10-04 2008-05-05 1
等等。
我想要创建的是这样的表:
USER_ID PAYER EXPAYER BASIC
1 0 1 0
2 0 0 1
我确实需要这样,因为我想在之后加入它并按城市分组。 但是,每个USER_D表中有多个条目(如上所示)。
我定义付款人是指某人有条目PRODUCT_ID = 1,因此今天的日期介于START和END_DATE之间。
前付款人是至少有过一次这样的参赛作品的人,现在已经没有了。
基本客户是其他任何人。
通过这样做:
CREATE OR REPLACE TABLE MEMBERSHIP AS
SELECT
USER_ID,
COUNT( CASE WHEN PRODUCT_ID=1 AND (CURRENT_DATE BETWEEN DG_START_DATE AND DG_END_DATE) THEN 1 END ) AS 'PAYER',
COUNT( CASE WHEN PRODUCT_ID=1 AND (CURRENT_DATE NOT BETWEEN DG_START_DATE AND DG_END_DATE) THEN 1 END ) AS 'EXPAYER',
COUNT( CASE WHEN NET_PRICE = 0 THEN 1 END ) AS 'BASIC'
FROM CONTRACTS;
但是,我的结果有例如这样的条目,这是错误的:
USER_ID PAYER EXPAYER BASIC
1 4 2 4
依此类推......
非常感谢!
答案 0 :(得分:0)
您应该使用SUM
代替COUNT
:
COUNT( CASE WHEN PRODUCT_ID=1 ...
成为
SUM (CASE WHEN PRODUCT_ID=1 ... then 1 else 0 end)
答案 1 :(得分:0)
您的insert语句应该导致语法错误,因为它缺少GROUP BY user_id
。此外,你在别名上使用单引号,应该是双引号(虽然它们在这里完全是多余的)。
这三种类型相互排斥;用户 付款人或 expayer 或基本。因此,请使用一个CASE结构。您可以在第二步中创建这三个不同的列,但这并没有多大意义,因为总是一列为1而其他列为0.更好的选择是类型的第二个表和一个列的列输入会员表。
create or replace table membership as
select
user_id,
case when type = 'payer' then 1 else 0 end as payer,
case when type = 'expayer' then 1 else 0 end as expayer,
case when type = 'basic' then 1 else 0 end as basic
from
(
select
user_id,
case when count(case when product_id = 1 and current_date between dg_start_date and dg_end_date then 1 end) > 0 then 'payer'
when count(case when product_id = 1 then 1 end) > 0 then 'expayer'
else 'basic'
end as type
from contracts
group by user_id
);