【问题标题】:Calculating business days in Teradata在 Teradata 中计算工作日
【发布时间】:2017-08-19 12:41:54
【问题描述】:

我在工作日计算方面需要帮助。

我有两张桌子

1) 一张表ACTUAL_TABLE 包含订单日期和联系日期以及时间戳数据类型。 2) 第二张表BUSINESS_DATES 列出了每个日历日期,并有一个标志表示周末。

使用这两个表,我需要确保在这两个字段之间计算工作日而不是日历日(这是当前逻辑)。

我的想法是首先通过比较ORDER_DATETABLE_DATE 字段来获得一系列日期,然后对CONTACT_DATETABLE_DATE 字段进行类似的比较。这将使我从BUSINESS_DATES 表中获得一个范围,然后我可以使用它来计算天数,sum(Holiday_WKND_Flag) 字段使结果看起来像:

Order#   | Count(*) As DAYS | SUM(WEEKEND DATES)
100      | 25               | 8

但是,这仅在我使用特定订单号并且不能将所有订单号带入子查询时才有效。

我的查询:

SELECT SUM(Holiday_WKND_Flag), COUNT(*) FROM
(
SELECT 
* FROM 
BUSINESS_DATES
WHERE BUSINESS.Business  BETWEEN (SELECT ORDER_DATE FROM ACTUAL_TABLE
WHERE ORDER#  = '100'
)

AND

(SELECT CONTACT_DATE FROM ACTUAL_TABLE
WHERE ORDER# = '100'
)

TEMP

正在上传表结构供您参考。

【问题讨论】:

    标签: sql teradata


    【解决方案1】:
    SELECT      ORDER#, SUM(Holiday_WKND_Flag), COUNT(*) 
    FROM        business_dates  bd
    INNER JOIN  actual_table    at ON bd.table_date BETWEEN at.order_date AND at.contact_date
    GROUP BY    ORDER#
    

    【讨论】:

      【解决方案2】:

      而不是加入 BETWEEN(这总是会导致错误的产品加入),然后是 COUNT,您最好为每个日期分配一个 工作日编号(最好只计算一次,然后作为列添加到您的日历表中)。然后是两个 Equi-Join,不需要聚合:

      WITH cte AS
       (
         SELECT
            Cast(table_date AS DATE) AS table_date, 
            -- assign a consecutive number to each busines day, i.e. not increased during weekends, etc.
            Sum(CASE WHEN Holiday_WKND_Flag = 1 THEN 0 ELSE 1 end)
            Over (ORDER BY table_date
                  ROWS Unbounded Preceding) AS business_day_nbr
         FROM business_dates
       )
      SELECT ORDER#, 
         Cast(t.contact_date AS DATE) - Cast(t.order_date AS DATE) AS #_of_days
         b2.business_day_nbr - b1.business_day_nbr AS #_of_business_days
      FROM actual_table AS t
      JOIN cte AS b1
        ON Cast(t.order_date AS DATE) = b1.table_date
      JOIN cte AS b2
        ON Cast(t.contact_date AS DATE) = b2.table_date
      

      顺便说一句,为什么table_dateorder_date timestamp 而不是date? 从 Oracle 移植?

      【讨论】:

        【解决方案3】:

        您可以使用此查询。希望对你有帮助

        select order#, 
            order_date, 
            contact_date, 
            (select count(1) 
                    from business_dates_table 
                    where table_date between a.order_date and a.contact_date 
                          and holiday_wknd_flag = 0
            ) business_days 
        from actual_table a
        

        【讨论】:

          猜你喜欢
          • 2022-01-17
          • 1970-01-01
          • 2010-09-25
          • 2014-04-26
          • 2015-01-10
          • 2016-02-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多