【问题标题】:SSRS DatePart Quarter with all year quartersSSRS DatePart Quarter 与所有年份季度
【发布时间】:2018-01-05 17:48:21
【问题描述】:

我有一张销售记录表。此表有一个 datetime 列,其中包含 closedealdate。

我正在使用 SSRS 来显示所有季度的销售数据。

为了总结宿舍,我的表达是:

="Q" & DatePart(DateInterval.Quarter,
                Fields!ActualCloseDate.Value,FirstDayOfWeek.System,
                FirstWeekOfYear.System)

但我只在我的日期时间列中获得季度,我如何获得数量为 0 或没有数据的季度?

谢谢!!

【问题讨论】:

  • 您可以添加您想要的以及您目前正在获得的图像或示例吗?
  • 我有:例如第一季度:1000 美元,第二季度:3000 美元,第四季度:500 美元。我需要显示“q3: USD 0”,我该如何使用 datepart 季度来做到这一点?因为我的数据集中没有 q3 日期的数据。谢谢!
  • 您需要在 SQL 中使用一些左连接并将 Null 替换为 0 来执行此操作。否则,请更新您的问题以添加 SQL 部分,我们可以尝试为您解决该问题。

标签: sql tsql reporting-services reporting datepart


【解决方案1】:

对于这种类型的事情,我通常使用日历表,其中包含所有日期的列表以及年份、季度、日期、星期几的列。在您的情况下,您可能只需要一个包含支持数据所需的所有年/季度组合的基表。然后查询从此表开始并加入您的销售数据。当销售数据为空时,您可以用 0 替换。

【讨论】:

  • 什么是日历表?是我可以与 Visual Studio 一起使用的特定控件吗?
  • 只是一个可以创建的sql表。在您的情况下,创建一个包含 2 列的 sql 表:year 和 qtr。然后用您的数据涵盖的年份以及每年的所有 4 瓦来填充它。将此作为您的 sql 查询的主表,然后将您的销售数据加入其中。如果您想包含您的 sql 查询,我可以帮助您修改它。
【解决方案2】:

Jason 完全正确,但我会为您节省一些时间和 link 我过去成功使用的日历表脚本,用于快速表。

为了死链接,这里是您正在查看的宿舍的相关部分,尽管我建议阅读我链接的页面,因为它是一个很好的教程。

DECLARE @StartDate DATE = '20000101', @NumberOfYears INT = 30;

-- prevent set or regional settings from interfering with 
-- interpretation of dates / literals

SET DATEFIRST 7;
SET DATEFORMAT mdy;
SET LANGUAGE US_ENGLISH;

DECLARE @CutoffDate DATE = DATEADD(YEAR, @NumberOfYears, @StartDate);

-- this is just a holding table for intermediate calculations:

CREATE TABLE #dim
(
  [date]       DATE PRIMARY KEY, 
  [day]        AS DATEPART(DAY,      [date]),
  [month]      AS DATEPART(MONTH,    [date]),
  FirstOfMonth AS CONVERT(DATE, DATEADD(MONTH, DATEDIFF(MONTH, 0, [date]), 0)),
  [MonthName]  AS DATENAME(MONTH,    [date]),
  [week]       AS DATEPART(WEEK,     [date]),
  [ISOweek]    AS DATEPART(ISO_WEEK, [date]),
  [DayOfWeek]  AS DATEPART(WEEKDAY,  [date]),
  [quarter]    AS DATEPART(QUARTER,  [date]),
  [year]       AS DATEPART(YEAR,     [date]),
  FirstOfYear  AS CONVERT(DATE, DATEADD(YEAR,  DATEDIFF(YEAR,  0, [date]), 0)),
  Style112     AS CONVERT(CHAR(8),   [date], 112),
  Style101     AS CONVERT(CHAR(10),  [date], 101)
);

-- use the catalog views to generate as many rows as we need

INSERT #dim([date]) 
SELECT d
FROM
(
  SELECT d = DATEADD(DAY, rn - 1, @StartDate)
  FROM 
  (
    SELECT TOP (DATEDIFF(DAY, @StartDate, @CutoffDate)) 
      rn = ROW_NUMBER() OVER (ORDER BY s1.[object_id])
    FROM sys.all_objects AS s1
    CROSS JOIN sys.all_objects AS s2
    -- on my system this would support > 5 million days
    ORDER BY s1.[object_id]
  ) AS x
) AS y;

请注意,这是上面的临时表,您可能希望将其具体化为架构中某处的真实表。

一旦您有了这个生成的表,您就可以通过从日历表中选择一组不同的季度开始您的上一个查询,然后将左外部连接到您的常规查询。这就是你如何获得那些“缺失”的日期。最后,请注意我使用了 coalesce 来为您的 USD 度量显示一个零数字,而不是使用空值:

SELECT distinct
  'Q' + CAST(quarter as varchar(1)) as Quarter,
  COALESCE(total, 0) as USD
FROM #dim as d
LEFT OUTER JOIN YourTable yt
  ON d.quarter = yt.quarter

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    相关资源
    最近更新 更多