首页 > 解决方案 > SQL Concat 并将日期转换为 MM/YYYY

问题描述

新手来了 提前感谢您的帮助!

我有以下代码来计算基于 3 个数据元素的唯一记录:

count(distinct concat(a.emp_nbr, b.acct_nbr, c.event_dt))

event_dt 作为 [DATE] 存储在数据库中。

问题是我不想在 concat match 语句中排除“DD”。我只想根据 MM/YYYY 进行匹配。我相信答案是将 [DATE] 转换为 MM/YYYY。

最终,我想根据 event_dt 的 emp_nbr、acct_nbr 和 mm/yyyy 来计算不同的记录。

谢谢!

修改的

这是查询:

select distinct
B.emp_nbr, A.cust_nbr,  E.cntry_enti_nbr, A.event_dt, 
count(distinct concat(B.emp_nbr, E.cntry_enti_nbr, A.event_dt))

from customer A

left join  user_profile B on A.owner_ID = B.owner_ID
left join account_owner E on A.cust_nbr = E.cust_nbr

where CAST(A.ramp_dt AS date format 'MM/DD/YYYY') between '01/01/2020' and '08/31/2020' 

group by 1,2,3,4

以下是返回的结果示例:

ln...emp_nbr......cust_nbr......ctry_enti_nbr event_dt......'唯一标识符'1......123............87543290...... 488807........2020 年 5 月 15 日.........1 2....123............62524497......488807...... .....2/28/2020............1 ** 3......123............62524497......488807...... ...2020 年 2 月 26 日............1 ** 4.......789............62524497......488807....... .2/26/2020…………1 5…………876…………62524497……488807…………2/26 /2020............1

第 2 行或第 3 行不应标记为“1”(唯一)

编辑:根据 dnoeth 的记录更改代码以添加 count(*) OVER (PARTITION):

select distinct
    B.emp_nbr, A.cust_nbr,  E.cntry_enti_nbr, A.event_dt, 
    to_char(A.event_dt, 'YYYYMM') as Event_Month, 
    case when COUNT(*) OVER (PARTITION BY B.emp_nbr, A.cntry_enti_nbr, Event_Month)
        = 1 then 1 else 0 end as Unique_Monthly_Event
    
    from customer A
    
    left join  user_profile B on A.owner_ID = B.owner_ID
    left join account_owner E on A.cust_nbr = E.cust_nbr
    
    where CAST(A.event_dt AS date format 'MM/DD/YYYY') between '01/01/2020' and '08/31/2020' 
    
    group by 1,2,3,4

在前一种情况下工作正常,但在另一种情况下,它显示所有零表示唯一:

ln...emp_nbr......cust_nbr......ctry_enti_nbr event_dt......'唯一标识符'1......123............78473466...... 863429............5/31/2020............0 2......123............78473466......863429...... .....5/29/2020............0
3......123............78473466......863429...... .5/5/2020........0

我想查看唯一标识符为“1”的 ONE 记录

标签: sqldateteradata

解决方案


您可以使用to_char(). 像这样的东西:

count(distinct concat(a.emp_nbr, '|', b.acct_nbr, '|', to_char(c.event_dt, 'YYYYMM'))

或更常见的:

count(distinct a.emp_nbr || '|' || b.acct_nbr || '|' || to_char(c.event_dt, 'YYYYMM')

请注意,这也会在

您的查询看起来不对劲。我想你只是想要:

select A.cust_nbr, E.cntry_enti_nbr, to_char(c.event_dt, 'YYYYMM'),
      count(*)
from customer A left join
     user_profile B
     on A.owner_ID = B.owner_ID left join
     account_owner E
     on A.cust_nbr = E.cust_nbr
where CAST(A.ramp_dt AS date format 'MM/DD/YYYY') between '01/01/2020' and '08/31/2020' 
group by A.cust_nbr, E.cntry_enti_nbr, to_char(c.event_dt, 'YYYYMM');

推荐阅读