SQL เพื่อแยก YYYY MM เป็นปีบัญชี

ฉันมีคอลัมน์ที่ระบุเดือนและปี YYYY MM ฉันได้แยกสิ่งเหล่านั้นออกเป็นสองคอลัมน์ (Year และ Month) ปัญหาคือ ปีคือปีปฏิทิน โดยหลักการแล้วฉันต้องการปีบัญชีที่ฉันใช้ (Apr 01 ถึง Mar 31 - ซึ่งจะไม่เปลี่ยนแปลง)

วิธีแก้ไขปัญหาอื่นๆ ที่ฉันเคยเห็นนั้นขึ้นอยู่กับรูปแบบวันที่ ในขณะที่คอลัมน์เดิมของฉันคือสตริง

ฉันต้องการใบแจ้งยอดที่ส่งคืนปีบัญชีสำหรับคอลัมน์ปีใหม่ของฉันแทนปีปฏิทิน

คำแถลงปัจจุบันของฉันคือ:

Select Month,
parsename(replace(Month,' ','.'),1) as MonthM,
parsename(replace(Month,' ','.'),2) as Year
FROM TblTrade

ซึ่งทำหน้าที่แยกคอลัมน์

ผลลัพธ์ที่คาดหวังจะเป็นเช่น: 15 ก.พ. กลายเป็น ก.พ. และ 2015 15 เม.ย. กลายเป็น เม.ย. และ 2016

กรุณาแนะนำ.


person Bikkembergs    schedule 27.01.2016    source แหล่งที่มา
comment
คุณสามารถเพิ่มข้อมูลตัวอย่างและผลลัพธ์ที่คาดหวังได้หรือไม่   -  person jarlh    schedule 27.01.2016
comment
กรุณาเพิ่มระบบของคุณ (เซิร์ฟเวอร์ SQL, การเข้าถึง ...)   -  person Nik Bo    schedule 27.01.2016
comment
ทำซ้ำ... stackoverflow.com/questions/ 1771995/ และ stackoverflow.com/questions/20554611/ และ stackoverflow.com/questions/12815334/ และ...และ...และ...   -  person Liesel    schedule 27.01.2016
comment
@LesH ฉันดูกระทู้อื่น ๆ มากมาย แต่น่าเสียดายที่ฉันไม่เห็นตัวอย่างที่รูปแบบดั้งเดิมตรงกับของฉัน ดังนั้นฉันจึงไม่สามารถแปลวิธีแก้ปัญหาที่ให้มาได้   -  person Bikkembergs    schedule 27.01.2016
comment
นี่เป็นเรื่องง่ายของการเขียนโปรแกรม ถ้าเดือนนั้นคือ Jan, Feb หรือ Mar ให้ลบหนึ่งออกจากปี ส่วนไหนที่คุณไม่รู้ว่าต้องทำอย่างไร?   -  person Tab Alleman    schedule 27.01.2016


คำตอบ (4)


เซิร์ฟเวอร์ SQL:

declare @date datetime = getdate();
select 
(YEAR(DATEADD(Month,-((DATEPART(Month,@date)+5) %12),@date))) AS Financial_Year

สมมติว่าเดือนเมษายนเป็นเดือนที่ 1

person Matt    schedule 27.01.2016

ลองสิ่งนี้

    select case 
             when to_char(to_date(column_name,'yyyy mm'),'mm') between 01 and 03 
                  then to_char(trunc(to_date(column_name,'yyyy mm')),'yyyy')-1
             else to_number(to_char(trunc(to_date(column_name,'yyyy mm')),'yyyy')) end 
    fiscal_year
    from table_name

ฉันใช้ oracle db สิ่งนี้จะทำงานเมื่อคอลัมน์เป็นสตริงและมีข้อมูลที่ถูกต้อง เช่น วันที่ในรูปแบบเช่น yyyy mm

person Narasimha Maiya    schedule 27.01.2016

เนื่องจากคุณได้อ่านบทความอื่นๆ เหล่านั้นแล้ว (คุณควรพูดถึงงานวิจัยที่คุณได้ทำในคำถามของคุณจริงๆ) และคุณยังคงประสบปัญหาอยู่ ฉันจึงได้เสนอวิธีแก้ปัญหาสำหรับคุณ

ถ้าฉันเข้าใจถูกต้อง คุณจะมี varchar ที่มี YYYY MM เช่น

2015 01
2015 02
2015 03
2015 04

ฯลฯ และคุณต้องการ

Jan 2014
Feb 2014
Mar 2014
Apr 2015

เอาล่ะ...

ตั้งค่าข้อมูลทดสอบบางส่วน

    DROP TABLE IF EXISTS #Test;

    WITH Dates AS (
        SELECT CAST(GETDATE() AS DATE) AS Date
        UNION ALL
        SELECT DATEADD(MONTH, -1, Date) FROM Dates
        WHERE Date > '20140101'
    )
    SELECT DISTINCT
        CONVERT(VARCHAR(4), YEAR(Date)) + ' ' +RIGHT(CONVERT(VARCHAR(6), Date, 112), 2) YearMonth
    INTO #Test 
     FROM Dates
    OPTION (MAXRECURSION 0);

    SELECT * FROM #Test

YearMonth
---------
2013 12
2014 01
2014 02
2014 03
2014 04
2014 05
etc

ค้นหาปีงบประมาณ

    SELECT 
        LEFT(YEARMONTH, 4) Year
        ,RIGHT(YEARMONTH, 2) Month
        ,LEFT(DATENAME(MONTH , DateAdd( month , CONVERT(INT,RIGHT(YEARMONTH, 2)) , -1 )), 3) MonthName
        ,IIF(CONVERT(INT, RIGHT(YEARMONTH, 2)) >= 4, CONVERT(INT,LEFT(YEARMONTH, 4)), CONVERT(INT,LEFT(YEARMONTH, 4)-1 )) FiscalYear
    FROM #TEST

    Year Month MonthName FiscalYear
    ---- ----- --------- -----------
    2013 12    Dec       2013
    2014 01    Jan       2013
    2014 02    Feb       2013
    2014 03    Mar       2013
    2014 04    Apr       2014
    2014 05    May       2014
    2014 06    Jun       2014
    etc

คุณสามารถใส่การแยกวิเคราะห์ปี/เดือนในแบบสอบถามย่อยเพื่อทำให้โค้ดสะอาดขึ้น และการจัดรูปแบบที่น่ารังเกียจบางส่วนอาจถูกแทนที่ด้วย FORMAT ตั้งแต่คุณใช้ปี 2012

หวังว่านี่คือสิ่งที่คุณต้องการและช่วยเหลือ

person Liesel    schedule 27.01.2016

เนื่องจากคุณรวมแท็ก Tableau ฉันจะอธิบายวิธีการ Tableau ซึ่งแตกต่างเล็กน้อยจากคำตอบอื่น ๆ เนื่องจากคุณมักจะระบุสิ่งที่คุณต้องการให้กับ Tableau และปล่อยให้ไดรเวอร์สร้าง SQL ที่จำเป็นสำหรับฐานข้อมูลของคุณ

ขั้นแรก จะทำงานได้ดีที่สุดถ้าคุณมีเขตข้อมูลเดียวที่มีประเภทข้อมูล DATE แทนที่จะแยกเขตข้อมูลสำหรับเดือนและปี

จากนั้นคุณสามารถสะสมวันที่เป็นปี เดือน วัน ฯลฯ ที่ใกล้ที่สุด (จริงๆ แล้วตัดทอนไปที่ตอนต้นของงวด) หรือแยกส่วนของวันที่ปี เดือน วัน ฯลฯ เฉพาะเจาะจงตามที่จำเป็นสำหรับการจัดกลุ่ม/การแสดงผล

ประโยชน์เพิ่มเติมของการทำงานกับประเภทข้อมูล DATE ที่แท้จริงคือคุณสามารถบอก Tableau ถึงจุดเริ่มต้นปีงบประมาณของคุณสำหรับแหล่งข้อมูลแต่ละแห่งได้ และมันจะจัดเรียงวันที่อย่างเหมาะสม เพียงคลิกขวาที่แหล่งข้อมูลแล้วตั้งค่าคุณสมบัติวันที่ คุณยังสามารถตั้งค่าเริ่มต้นสัปดาห์และรูปแบบวันที่ได้อีกด้วย

person Alex Blakemore    schedule 28.01.2016