同一用户的多行 - 但我不需要所有这些

时间:2017-11-06 14:05:05

标签: sql oracle rows

我的表格如下所示:

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

依此类推......

非常感谢!

2 个答案:

答案 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
);