如何在sql中创建动态where子句?
Posted
技术标签:
【中文标题】如何在sql中创建动态where子句?【英文标题】:How to create a dynamic where clause in sql? 【发布时间】:2016-07-19 14:22:58 【问题描述】:因此,我创建了一个表,其中包含来自包含所有客户购买记录的事务表的以下列: 1. 月-年,2.客户 ID,3. 当月的交易次数。
我正在尝试创建一个具有以下输出的表 1. 月-年,2. 活跃客户数量定义为在上一年至少有 1 次购买。
我目前的代码是这样的,但显然只捕获一个日期并且 where 子句不是动态的。非常感谢您的帮助。
select month_start_date, cust_ID,
(case when month_start_Date between date and add_months(date, -12) then count(cust_ID) else 0 end) as active
from myserver.mytable
where
month_start_Date>add_months(month_start_date,-12)
group by 1,2
编辑:我只是想在客户旁边放一个标志,如果他们每个月都活跃,定义为去年至少有一次交易,谢谢!
【问题讨论】:
“动态WHERE
子句”是什么意思?
你想让哪个部分变得“动态”?您可以使用参数来指定最小数据,但不清楚您要做什么。
我只是想在客户旁边放一个标志,如果他们每个月都活跃,定义为去年至少有一次交易,谢谢!
您想统计过去 12 个月内没有交易的客户吗?
是的,我想将活动标志定义为过去一年中至少 1 笔交易。我的代码日期范围不是动态的,所以它没有做我想做的事情。
【参考方案1】:
您可以使用 Teradata 的专有 EXPAND ON
synax 来创建时间序列:
SELECT month_start_date, COUNT(*)
FROM
( -- create one row for every month within the next year
-- after a customer's transaction
SELECT DISTINCT
BEGIN(pd) AS month_start_date,
cust_ID
FROM myserver.mytable
EXPAND ON PERIOD(month_start_date, ADD_MONTHS(month_start_date,12)) AS pd
BY ANCHOR MONTH_BEGIN -- every 1st of month
FOR PERIOD (DATE - 500, DATE) -- use this to restrict to a specific date range
) AS dt
GROUP BY month_start_date
ORDER BY month_start_date
【讨论】:
Dnoeth,你介意向我解释一下最后的 period 命令是做什么的吗?我意识到 expand 只是为接下来的 12 个月的每一行创建副本,但第一个 period(month_start_date, add_months(month_start_date, 12)) 不是已经这样做了吗?我只是不确定最后一个 period(date-500, date) 是做什么的。我将其更改为 365,但不知道它完成了什么。 @Analyst:是可选的,它将返回的行限制在这个日期范围内,例如该期限涵盖十年,但您只希望返回两个特定年份的日期。以上是关于如何在sql中创建动态where子句?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SQL 查询中动态跳过没有 If else 的 where 子句?