sql - 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 记录
解决方案
您可以使用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');
推荐阅读
- jquery - 根据所选选项显示相关 div
- javascript - 我可以在数组元素周围包装一个类吗?
- wso2is - WSO2 API + SSO - 被动模式和匿名存储访问
- nginx - 自托管 Gitlab 服务器无法访问
- laravel - 使用 Let's Encrypt 为我的 laravel 应用程序提供 SSL 保护
- wpf - 混合制作的样式在 Visual Studio 中不起作用
- css - 在标题下添加横幅图像
- angular - 如何将此json数据存储在数组中
- amazon-web-services - 通过 Terraform 添加 SNS 过滤策略
- php - PHP 7.2 的可数问题