【问题标题】:Extract Data for 2 years and convert number to month提取数据 2 年并将数字转换为月份
【发布时间】:2014-12-18 10:35:15
【问题描述】:

我有下表,我想加入以创建日期的月份和年份分开(因为我没有日期,因此可以将其设置为第一个)

测量 mm yyyy 15000 1 2014 16000 2 2014 15000 5 2013 16000 3 2014 15000 4 2014 16000 5 2014 15000 6 2013 16000 7 2012

所以我希望输出为:

15000 01/01/2014
16000 01/02/2014

等等

仅限过去 2 年。

这可能吗?

谢谢

【问题讨论】:

    标签: sql asp.net sql-server-2008


    【解决方案1】:
    SELECT Measurement,DT FROM
    (
        SELECT Measurement,DENSE_RANK() OVER(ORDER BY YYYY DESC) RNK,
        CONVERT(varchar(11),'01'+'/'+CAST(MM AS VARCHAR(2))+'/'+CAST(YYYY AS VARCHAR(4)),103) DT
        FROM #TEMP
    )TAB
    WHERE RNK IN(1,2)
    

    更新

    我正在根据您的新要求进行更新

    在这里,我们将获得整个月和LEFT JOIN 与您的餐桌

    ;WITH CTE1 AS
    (
        SELECT 1 ID, CAST('01/01/2013' AS DATE) DT
        UNION ALL 
        SELECT ID+1,DATEADD(MONTH,1,DT) FROM CTE1
        WHERE ID<12
    )
    SELECT ID,DATENAME(MONTH,DT) [MONTH],TP.*,
    DENSE_RANK() OVER(ORDER BY YYYY DESC) RNK
    INTO #NEWTABLE
    FROM CTE1
    LEFT JOIN TEMP TP ON CAST(TP.MM AS NUMERIC(3,0)) = CAST(CTE1.ID AS NUMERIC(3,0)) 
    

    现在我们声明 2 个变量,第一个变量用于获取值以将月份的行显示为列,第二个变量用于替换 NULL with zero

    DECLARE @cols NVARCHAR (MAX)
    DECLARE @NullToZeroCols NVARCHAR (MAX)
    
    SELECT @cols = COALESCE (@cols + ',[' + [MONTH] + ']', 
                  '[' + [MONTH] + ']')
                   FROM    (SELECT DISTINCT ID,[MONTH] FROM #NEWTABLE) PV  
                   ORDER BY ID
    
    SET @NullToZeroCols = SUBSTRING((SELECT ',ISNULL(['+[MONTH]+'],0) AS ['+[MONTH]+']' 
    FROM(SELECT DISTINCT [MONTH],ID FROM #NEWTABLE GROUP BY [MONTH],ID)TAB  
    ORDER BY ID  FOR XML PATH('')),2,8000)
    

    现在我们在您的表格中选择过去两年并对其进行旋转

    DECLARE @query NVARCHAR(MAX)
    SET @query = 'SELECT yyyy,' + @NullToZeroCols + ' FROM 
                 (
                     SELECT yyyy, [MONTH], Measurement FROM #NEWTABLE
                     WHERE RNK IN(1,2)
                 ) x
                 PIVOT 
                 (
                     SUM(Measurement)
                     FOR [MONTH] IN (' + @cols + ')
                  ) p
                  WHERE yyyy IS NOT NULL
                  ORDER BY yyyy;' 
    
    EXEC SP_EXECUTESQL @query
    

    【讨论】:

    • 请问这是转换后的有效日期吗?
    • 是的。为了安全起见,您可以转换为 CAST(DT AS DATE) @user1824963
    • 非常感谢,但 Visual Studio 似乎无法将其识别为日期?抱歉,不确定您所说的 CAST(DT AS 日期)是什么意思
    • 它是否在 SQL Server 部分工作? @user1824963
    • 也许我看错了我试图让 2 个系列返回以按月填充图表,我认为这可以解决问题,但看起来这只是一个系列?跨度>
    猜你喜欢
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多