首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Power BI Weeknum迭代

Power BI Weeknum迭代
EN

Stack Overflow用户
提问于 2020-02-14 01:59:17
回答 2查看 1.6K关注 0票数 0

我的目标是基于修改后的4-4-5日历,使用DAX或m代码显示weeknum,如果它更有意义的话。

这意味着一月份的第一个星期天是第1周,所有的周都应该是完整的周(7天)。2018年年底是第53周,根据定义,它将延长到2019年1 /5周六-2019年的第一个周日将是2019年1/6,也就是第一周。我每年都无法重置weeknum函数。如果我一年中的前几个日历天是52周或53周,那么下一周应该是1,而不是从第2周开始。

尝试通过if语句、lookupvalue等减去-1 weeknum总是会抛出一些东西。

使用WEEKNUM(DATE,1)将从周日开始提供完整的周,除非是年初。

使用WEEKNUM(DATE,17)还将从周日开始提供完整的周,如果不是完整的7天,则还会延长前一年结束的一周。(第53周延至下一年的第1天历周)。

问题仍然是,进入明年,第一周要么部分或完全被前一年年底的一周取代。基本上,我只能获得几乎一年的正确结果,而不是日历表中的5+年份。

我还有周开始日期列、周结束日期列和年日列(1到365/366)。关于每年迭代适当的weeknum的逻辑有什么建议吗?谢谢。

EN

回答 2

Stack Overflow用户

发布于 2020-02-14 03:41:39

据我所知,要做到这一点,唯一的方法是使用一堆IF条件。我已经尝试过了,看起来我得到了正确的值。以下计算假设您正在寻找从周日到周六的一周:

代码语言:javascript
复制
Weeknum Calc = 
        IF(WEEKDAY(DATE(YEAR('Calendar'[Date]),1,1))>1 && WEEKDAY(DATE(YEAR('Calendar'[Date])-1,1,1))=1 && WEEKNUM('Calendar'[Date])=1,53,
        IF(WEEKDAY(DATE(YEAR('Calendar'[Date]),1,1))>1 && WEEKDAY(DATE(YEAR('Calendar'[Date])-1,1,1))=2 && WEEKNUM('Calendar'[Date])=1 && MOD(YEAR('Calendar'[Date])-1,4)=0,53,
        IF(WEEKDAY(DATE(YEAR('Calendar'[Date]),1,1))>1 && WEEKNUM('Calendar'[Date])=1,52,
        IF(WEEKDAY(DATE(YEAR('Calendar'[Date]),1,1))>1,WEEKNUM('Calendar'[Date])-1,
        WEEKNUM('Calendar'[Date])
        ))))

要进一步详细介绍IF条件,请执行以下操作:

如果条件1:这是对一年的前几天进行编号,前提是它不是从星期天开始的。如果前一年是从星期天开始的,那么今年的第一周应该是第53周。

如果条件2:这是对一年的前几天进行编号,前提是它不是从星期天开始的。这种情况特定于前一年是闰年。如果前一年从星期一开始,并且前一年是闰年,则今年的第一周应该是53

如果条件3:这是对一年的前几天进行编号,前提是它不是从星期天开始的。如果一年的第一周不满足条件1和2,则今年的第一周应为52周。

如果条件4:这是一年中所有其他周的数字。如果一年不是从星期日开始的,则周数应为weeknum-1

ELSE条件:这是一年中所有其他周的数字。如果一年在星期天开始,则周数应为weeknum

这应该会给你想要的结果。

票数 2
EN

Stack Overflow用户

发布于 2020-02-14 04:13:05

我有类似的财务周数,期间和日期的要求。

我在数据库中创建了表,并已将其导入到poweri bi报告中。

我的财务周从3月2日星期天开始,从今年开始10年的财务周号。

下面的脚本可能会对你有所帮助:

代码语言:javascript
复制
-- Create DI_Date diamension table:
CREATE TABLE APM_Reporting.di_date
(
     "datekey"              INTEGER     NOT NULL 
    ,"dateid"               DATE        NOT NULL  
    ,"day"                  INTEGER     NOT NULL
    ,"dayname"              VARCHAR(10) NOT NULL 
    ,"daynameshort"         VARCHAR(3)  NOT NULL
    ,"weekid"               INTEGER     NOT NULL  
    ,"financialweekid"      INTEGER     NOT NULL
    ,"monthid"              INTEGER     NOT NULL
    ,"monthname"            VARCHAR(25) NOT NULL 
    ,"periodid"             INTEGER     NOT NULL  
    ,"periodname"           VARCHAR(25) NOT NULL 
    ,"quarterid"            INTEGER     NOT NULL  
    ,"quartername"          VARCHAR(25) NOT NULL 
    ,"year"                 INTEGER     NOT NULL  
    ,"finyear"              VARCHAR(25) NOT NULL
    ,"created_timestamp"    DATETIME DEFAULT CURRENT_TIMESTAMP
    ,PRIMARY KEY (datekey)
);
-- Check if temp table exists and drop it if true
IF OBJECT_ID('tempdb..##Dates') IS NOT NULL
    DROP TABLE ##Dates
-- Create temporary table for pre-load
  CREATE TABLE ##Dates(
                DateValue Date 
                      )
;                      
-- Declare Start Date
  DECLARE @start DATE = GETDATE() - 396
  DECLARE @end DATE = DATEADD(year, 10,@start)
  WHILE @start < @end
  BEGIN
    INSERT INTO  ##Dates(DateValue)
    VALUES(@start)  
    SET @start = DATEADD(dd,1,@start)
  END
  ;
-- Insert generated data to di_date
INSERT INTO APM_Reporting.di_date 
(
    "datekey",
    "dateid",
    "day",
    "dayname",
    "daynameshort",
    "weekid",
    "financialweekid",
    "monthid",
    "monthname",
    "periodid",
    "periodname",
    "quarterid",
    "quartername",
    "year",
    "finyear"
)

SELECT 
    YEAR(DateValue)*10000+MONTH(DateValue)*100+DAY(DateValue) AS "datekey"
    ,DateValue "dateid"
    ,DAY(DateValue) "day"
    ,DATENAME(dw, DateValue) "dayname"
    ,LEFT(DATENAME(dw,DateValue),3) "daynameshort"
    ,DATEPART(WK,DateValue) "weekid"
    ,CASE
    WHEN DATEPART(WK,DateValue) < 11 THEN DATEPART(WK,DateValue)+42
    ELSE DATEPART(WK,DateValue) - 10
    END AS  "financialweekid"
    ,DATEPART(MM, DateValue) "monthid"
    ,DATENAME(MM,DateValue) "monthname"
    ,CAST(
    CONCAT(
        (CASE 
            WHEN DATEPART(WK,DateValue) BETWEEN 1 and 10 THEN DATEPART(YYYY,DateValue)-1
            ELSE DATEPART(YYYY,DateValue)
        END)
    ,
    CASE
        WHEN DATEPART(WK,DateValue)  BETWEEN '11' AND '14' THEN '01'
        WHEN DATEPART(WK,DateValue)  BETWEEN '15' AND '18' THEN '02'
        WHEN DATEPART(WK,DateValue)  BETWEEN '19' AND '22' THEN '03'
        WHEN DATEPART(WK,DateValue)  BETWEEN '23' AND '26' THEN '04'
        WHEN DATEPART(WK,DateValue)  BETWEEN '27' AND '30' THEN '05'
        WHEN DATEPART(WK,DateValue)  BETWEEN '31' AND '34' THEN '06'
        WHEN DATEPART(WK,DateValue)  BETWEEN '35' AND '38' THEN '07'
        WHEN DATEPART(WK,DateValue)  BETWEEN '39' AND '42' THEN '08'
        WHEN DATEPART(WK,DateValue)  BETWEEN '43' AND '46' THEN '09'
        WHEN DATEPART(WK,DateValue)  BETWEEN '47' AND '50' THEN '10'
        WHEN DATEPART(WK,DateValue)  BETWEEN '51' AND '53' THEN '11'
        WHEN DATEPART(WK,DateValue)  BETWEEN '01' AND '02' THEN '11'
        WHEN DATEPART(WK,DateValue)  BETWEEN '03' AND '06' THEN '12'
        WHEN DATEPART(WK,DateValue)  BETWEEN '06' AND '53' THEN '13'
    ELSE '00'
    END) AS INTEGER) AS "periodid"
    ,CONCAT('P',
    CASE
        WHEN DATEPART(WK,DateValue)  BETWEEN '11' AND '14' THEN '01'
        WHEN DATEPART(WK,DateValue)  BETWEEN '15' AND '18' THEN '02'
        WHEN DATEPART(WK,DateValue)  BETWEEN '19' AND '22' THEN '03'
        WHEN DATEPART(WK,DateValue)  BETWEEN '23' AND '26' THEN '04'
        WHEN DATEPART(WK,DateValue)  BETWEEN '27' AND '30' THEN '05'
        WHEN DATEPART(WK,DateValue)  BETWEEN '31' AND '34' THEN '06'
        WHEN DATEPART(WK,DateValue)  BETWEEN '35' AND '38' THEN '07'
        WHEN DATEPART(WK,DateValue)  BETWEEN '39' AND '42' THEN '08'
        WHEN DATEPART(WK,DateValue)  BETWEEN '43' AND '46' THEN '09'
        WHEN DATEPART(WK,DateValue)  BETWEEN '47' AND '50' THEN '10'
        WHEN DATEPART(WK,DateValue)  BETWEEN '51' AND '53' THEN '11'
        WHEN DATEPART(WK,DateValue)  BETWEEN '01' AND '02' THEN '11'
        WHEN DATEPART(WK,DateValue)  BETWEEN '03' AND '06' THEN '12'
        WHEN DATEPART(WK,DateValue)  BETWEEN '06' AND '53' THEN '13'
    ELSE '00'
    END) "periodname"
    ,DATEPART(Q,DateValue) "quarterid"
    ,CONCAT('Q',DATEPART(Q,DateValue)) "quartername"
    ,DATENAME(YYYY,DateValue) "year"
    ,CASE
    WHEN DATEPART(WK,DateValue)  BETWEEN '11' AND '53' THEN CONCAT(DATENAME(YYYY,DateValue),'-',DATENAME(YYYY,DateValue)+1)
    ELSE CONCAT(DATENAME(YYYY,DateValue)-1,'-',DATENAME(YYYY,DateValue))
    END AS "finyear"
FROM ##Dates;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60213918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档