【问题标题】:Is there a way to associate a column with a date range?有没有办法将列与日期范围相关联?
【发布时间】:2021-03-13 11:35:27
【问题描述】:

我正在编写年初至今的总工资报告。 我想知道是否有办法将列与日期相关联。 我的想法是有人可以选择一个日期范围甚至一个结束月份,并且只返回该范围的 GROSWAGS_X。 (1 是 1 月,2 是 2 月,依此类推) 例如: 用户选择 2020 年 1 月 1 日作为开始日期,选择 2020 年 10 月 31 日作为结束日期。这将带来 GROSWAGS 1-10,但不包括 11 和 12。 要么 用户选择 2020 年 10 月。这将带回 1-10,不包括 11 和 12。 环境是MSSQL 2019,使用SSRS创建报表。 表格的示例格式如下。

EMPID  GROSWAGS_1  GROSWAGS_2  GROSWAGS_3...
00001  2000.00     2000.00     2000.00

编辑:我能够通过在 SSRS 中添加一个计算列来获得所需的内容。像这样:

=IIf(Month(Parameters!EndDate.Value)=1,Fields!GROSWAGS_1.Value,
IIf(Month(Parameters!EndDate.Value)=2,Fields!GROSWAGS_1.Value+Fields!GROSWAGS_2.Value,
IIf(Month(Parameters!EndDate.Value)=3,Fields!GROSWAGS_1.Value+Fields!GROSWAGS_2.Value+Fields!GROSWAGS_3.Value,"error")))

【问题讨论】:

  • 听起来你有设计缺陷。不应该有多个 GROSWAGS 列,应该有一个,其中一个 integer 值作为数字,然后是另一列作为值。规范您的设计,您就没有问题。
  • 正如其他人所说,这不是一个好的设计。您的基础数据实际上看起来像这样,还是这些数据是存储过程或视图的结果?如果您的基础数据实际上已标准化,请编辑您的问题并显示该结构的示例。如果它被规范化,那么构建查询将很简单。
  • @AlanSchofield 数据实际上是这样的。它让我感到惊讶,因为它是我们 Dynamics GP 数据库中的一个表。我无法更改此数据或表格,因为 GP 正在使用它。我想可以做一些 ETL,但对于我认为的单个报告来说,这是一个很好的工作量。

标签: sql tsql reporting-services


【解决方案1】:

没有。您将使用单独的行。像这样的:

EMPID    PERIOD_START   PERIOD END    GROSS_WAGES

每一列将位于单独的行上。瞧!您可以方便地将范围作为数据中的列。

【讨论】:

    【解决方案2】:

    这并不理想,但假设您的列名是静态的,那么您可以像这样取消透视数据

    我已根据您提供的内容复制了您的数据结构并添加了一些示例数据

    -- these DECLARES should be removed from the report's dataset query
    -- They are only present for testing
    -- Replace references to these with he names of the Report's parameters
    
    DECLARE @StartDate Date = '2020-02-01'
    DECLARE @EndDate Date = '2020-11-01'
    
    DECLARE @t TABLE (EMPID int, GROSWAGS_1 DECIMAL(10,2),  GROSWAGS_2  DECIMAL(10,2), GROSWAGS_3 DECIMAL(10,2)
                    , GROSWAGS_4 DECIMAL(10,2), GROSWAGS_5 DECIMAL(10,2), GROSWAGS_6 DECIMAL(10,2), GROSWAGS_7 DECIMAL(10,2)
                    , GROSWAGS_8 DECIMAL(10,2), GROSWAGS_9 DECIMAL(10,2), GROSWAGS_10 DECIMAL(10,2), GROSWAGS_11 DECIMAL(10,2)
                    , GROSWAGS_12 DECIMAL(10,2) )
    
    INSERT INTO @t VALUES
    (1, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100),
    (2, 1001, 1101, 1201, 1301, 1401, 1501, 1601, 1701, 1801, 1901, 2001, 2101),
    (3, 1003, 1103, 1203, 1303, 1403, 1503, 1603, 1703, 1803, 1903, 2003, 2103)
    
    SELECT * 
        FROM 
            (
            SELECT EmpID, CAST(REPLACE(Mnth, 'GROSWAGS_','') AS INT) AS MonthNumber, Wage
            FROM @t
            UNPIVOT
                (
                    Wage 
                    FOR Mnth IN (GROSWAGS_1,  GROSWAGS_2, GROSWAGS_3, GROSWAGS_4, GROSWAGS_5, GROSWAGS_6, GROSWAGS_7, GROSWAGS_8, GROSWAGS_9, GROSWAGS_10, GROSWAGS_11, GROSWAGS_12 )
                ) as up
            ) a 
        WHERE a.MonthNumber BETWEEN MONTH(@StartDate) AND MONTH(@EndDate)
    

    生成的输出如下所示(仅显示前几行)

    一旦您拥有这种格式的数据,您的报告中就会很容易使用。

    注意:没有处理年份的逻辑,因为这在您的示例数据中不可见。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-17
      • 1970-01-01
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多