如何查找两个不同日期字段 SQL 之间在特定时间间隔内是否存在匹配项?
How to find if there is a match in a certain time interval between two different date fields SQL?
我的事实 table 中有一列根据以下案例陈述定义供应商是旧供应商还是新供应商:
CASE
WHEN (SUBSTRING([Reg date], 1, 6) = SUBSTRING([Invoice date], 1, 6)
THEN ('New supplier')
ELSE('Old supplier')
END as [Old/New supplier]
因此,例如,如果供应商注册于 201910 并且发票日期为 201910,则该供应商将被视为该月的 'New supplier'。现在我想通过对 Supplier no 进行不同的计数来计算每个月 Old/New 供应商的数量,这不是问题。最后一步变得棘手,现在我想计算 12 个月内 New/Old 供应商的数量(如果在任何滞后的 12 个月中发票日期和注册日期匹配) .所以我创建了以下 mdx 表达式:
aggregate(parallelperiod([D Time].[Year-Month-Day].[Year],1,[D Time].[Year-Month-Day].currentmember).lead(1) : [D Time].[Year-Month-Day].currentmember ,[Measures].[Supplier No Distinct Count])
我面临的问题是它将计算供应商编号“1234”两次,因为它在那个时间段内既有新的也有旧的。我希望的是,如果它找到一个匹配项,它将被视为该 12 个月期间的 "New" 供应商。
这就是结果的最终结果,但我希望它在 "Old" 中为零,因为注册日期和发票日期在这 12 个月期间匹配一次,对于整个滚动 12 应该被视为新的201910 月
非常感谢任何帮助、可能的方法或想法。
此致,
规则
SELECT COUNT(*) OVER () AS TotalCount
FROM Facts
WHERE Regdate BETWEEN(olddate, newdate) OR InvoiceDate BETWEEN(olddate, newdate)
GROUP BY
Supplier
以上查询会return该时间段内的所有供应商,然后对他们进行分组。因此 COUNT(*) 将仅包括唯一订阅者。
您可能想更改 WHERE 子句,因为我不太明白您是如何获得 12 个月期限的。通常,如果您的 where 子句 return 是那个时间段内的供应商(他们不必是唯一的),那么 group by 和 count 将处理其余部分。
首先在供应商级别聚合,然后在类型级别聚合:
select type, count(*)
from (select supplierid,
(case when min(substring(regdate, 1, 6)) = min(substring(invoicedate, 1, 6))
then 'new' else 'old'
end) as type
from t
group by supplierid
) s
group by type;
注意:我假设您的日期列采用某种晦涩的字符串格式,以便您的代码正常工作。否则,您应该使用适当的日期函数。
我的事实 table 中有一列根据以下案例陈述定义供应商是旧供应商还是新供应商:
CASE
WHEN (SUBSTRING([Reg date], 1, 6) = SUBSTRING([Invoice date], 1, 6)
THEN ('New supplier')
ELSE('Old supplier')
END as [Old/New supplier]
因此,例如,如果供应商注册于 201910 并且发票日期为 201910,则该供应商将被视为该月的 'New supplier'。现在我想通过对 Supplier no 进行不同的计数来计算每个月 Old/New 供应商的数量,这不是问题。最后一步变得棘手,现在我想计算 12 个月内 New/Old 供应商的数量(如果在任何滞后的 12 个月中发票日期和注册日期匹配) .所以我创建了以下 mdx 表达式:
aggregate(parallelperiod([D Time].[Year-Month-Day].[Year],1,[D Time].[Year-Month-Day].currentmember).lead(1) : [D Time].[Year-Month-Day].currentmember ,[Measures].[Supplier No Distinct Count])
我面临的问题是它将计算供应商编号“1234”两次,因为它在那个时间段内既有新的也有旧的。我希望的是,如果它找到一个匹配项,它将被视为该 12 个月期间的 "New" 供应商。
这就是结果的最终结果,但我希望它在 "Old" 中为零,因为注册日期和发票日期在这 12 个月期间匹配一次,对于整个滚动 12 应该被视为新的201910 月
非常感谢任何帮助、可能的方法或想法。
此致, 规则
SELECT COUNT(*) OVER () AS TotalCount
FROM Facts
WHERE Regdate BETWEEN(olddate, newdate) OR InvoiceDate BETWEEN(olddate, newdate)
GROUP BY
Supplier
以上查询会return该时间段内的所有供应商,然后对他们进行分组。因此 COUNT(*) 将仅包括唯一订阅者。
您可能想更改 WHERE 子句,因为我不太明白您是如何获得 12 个月期限的。通常,如果您的 where 子句 return 是那个时间段内的供应商(他们不必是唯一的),那么 group by 和 count 将处理其余部分。
首先在供应商级别聚合,然后在类型级别聚合:
select type, count(*)
from (select supplierid,
(case when min(substring(regdate, 1, 6)) = min(substring(invoicedate, 1, 6))
then 'new' else 'old'
end) as type
from t
group by supplierid
) s
group by type;
注意:我假设您的日期列采用某种晦涩的字符串格式,以便您的代码正常工作。否则,您应该使用适当的日期函数。