Sql server 如何在SQL或SSRS标题中动态更新字段名

Sql server 如何在SQL或SSRS标题中动态更新字段名,sql-server,reporting-services,ssrs-2008-r2,Sql Server,Reporting Services,Ssrs 2008 R2,您好,我有一个这样的记录集: 2015-07-08 2015-05-08 Title Description A California 11 3 B Florida 2 4 现在,在上面的日期字段中,我需要动态更改它们的名称,如 如果我们有2015-07-08本周的its,那么我需要“本周加载”作为字段名而不是日期,如果是

您好,我有一个这样的记录集:

                       2015-07-08     2015-05-08
Title   Description    
A       California       11              3
B       Florida           2              4
现在,在上面的日期字段中,我需要动态更改它们的名称,如

如果我们有2015-07-08本周的its,那么我需要“本周加载”作为字段名而不是日期,如果是2015-06-08,那么它是一个月前的,所以我需要“上个月加载”,如果是2015-02-08,那么我需要它作为“最后一个季度”。我怎样才能做到这一点


请在此方面提供帮助,谢谢


像这样的东西怎么样(使用动态查询更改列名)
这不是逐字逐句的,但应该给你一个例子

CREATE TABLE #TMP
(
    TITLE VARCHAR(MAX)
    , DESCR VARCHAR(MAX)
    , [2015-07-09] INT
    , [2015-05-09] INT
)

DECLARE @QUERY VARCHAR(MAX)
SET @QUERY = ' SELECT TITLE, DESCR, [2015-07-09] '

IF  '2015-07-09 00:00:00.000' = (SELECT CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE(), 101)))
SET @QUERY = @QUERY + ' AS [THIS WEEK] FROM #TMP'

EXECUTE (@QUERY)

DROP TABLE #TMP

注:如果您喜欢此解决方案,请单击它旁边的勾号。谢谢。

动态标题不太容易实现。。。你可以 1.尝试使用动态sql 2.尝试用PIVOT找到解决方案

这取决于可能有多少不同的名称(只有“本周”、“上个月”和“上个季度”)?在这种情况下,您可以在case-WHEN中创建此名称作为选择的一部分,然后将其标题用作透视接收器

我很快会尝试添加一点示例

给你:

DECLARE @dates TABLE(d DATE,SomeValue INT);
INSERT INTO @dates
VALUES({ts'2015-07-08 00:00:00'},2)
     ,({ts'2015-07-07 00:00:00'},3)
     ,({ts'2015-07-01 00:00:00'},4)
     ,({ts'2015-06-02 00:00:00'},5)
     ,({ts'2015-05-27 00:00:00'},6)
     ,({ts'2015-03-17 00:00:00'},6)
     ,({ts'2015-01-07 00:00:00'},6)
     ,({ts'2014-05-27 00:00:00'},6)
     ,({ts'2014-05-27 00:00:00'},6);

WITH Today AS
(SELECT GETDATE() AS dat)
,dateBorders AS
(
    SELECT CAST(dat-DATEPART(WEEKDAY,dat) + 1 AS DATE) AS ThisMonday --please check this as it differs in cultures!
          ,CAST(CAST(YEAR(dat) AS VARCHAR(4)) + REPLACE(STR(MONTH(dat),2),' ','0') + '01' AS DATE) AS ThisMonthBegin
          ,CASE WHEN MONTH(dat) IN(3,6,9,12) THEN 2
                WHEN MONTH(dat) IN(4,7,10,1) THEN 3
                WHEN MONTH(dat) IN(5,8,12,2) THEN 4 END AS MonthsToPrevQuarter
    FROM Today
)
,dateBorders2 AS
(
    SELECT *
          ,CAST(CAST(YEAR(ThisMonthBegin) AS VARCHAR(4)) + REPLACE(STR(MONTH(ThisMonthBegin) - MonthsToPrevQuarter,2),' ','0') + '01' AS DATE) AS LastQuarterBegin
    FROM dateBorders
)
SELECT p.*
FROM
(
    SELECT SomeValue
          ,CASE WHEN d>=ThisMonday THEN 'This week'
                WHEN d>=ThisMonthBegin THEN 'This month'
                WHEN d>=LastQuarterBegin THEN 'Last quarter'
                ELSE 'older' END AS pivotMark
    FROM dateBorders2,@dates
) AS tbl
PIVOT
(
    SUM(SomeValue) FOR PivotMark IN([This week],[This month],[Last quarter],[older])
) AS p
注意:在接近年终休息时,会有更多的人在这一年里摆弄


如果你喜欢这个,请标记和/或投票,谢谢

当然这会有帮助,我也在尝试,因为我们只寻找最新的记录,其余的都是上一个记录。