如何在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子句?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Where 子句在 MySql 中创建触发器

如何在 SQL 的 WHERE 子句中动态调用列

如何在 SQL 查询中动态跳过没有 If else 的 where 子句?

从搜索表单动态构建 WHERE 子句时如何防止 SQL 注入?

如何使用 SQL 格式的动态 where 子句制作谓词

如何将字符串变量传递给动态sql中的where子句