【问题标题】:SSRS set year variables per recordSSRS 为每条记录设置年份变量
【发布时间】:2019-12-20 03:41:00
【问题描述】:

我需要帮助来创建代码以显示指定的年份。

用户定义要报告的年份:Year1 Year2 Year3

ProductID   Year1 data
            Year2 data
            Year3 data

即使第 2 年没有如下数据

ProductID   Year1 data
            Year2 
            Year3 data

我当前的代码将显示符合条件的所有数据,但由于没有数据而不会显示 Year2。

我当前的代码是

select 
    sales.ProductID, Sales.Trans_Year, Sum(salesQTY) as QTY
from 
    (select ProductID, Year(Trans_dt) as Trans_Year, salesQTY
     from salestable) sales
group by 
    sales.ProductID, Sales.Trans_Year

我的代码效率低下,但我做了两次选择,以便它将年份分组,如果有任何新的使它更好,将不胜感激。

希望得到帮助有以下结果。

ProductID   Year1 QTY
ProductID   Year2 
ProductID   Year3 QTY

谢谢

【问题讨论】:

  • 外部加入一个返回所有需要年份的 cte/help 表。

标签: sql tsql reporting-services


【解决方案1】:

您可以从表中选择年份并将它们交叉连接到产品,以获得所有年份和产品的矩阵。 CROSS JOIN 将为每个产品记录每一年的记录——无论该产品是否在该年售出。

然后 LEFT 加入您的销售总额。使用 LEFT JOIN 将允许显示来自 SALES_YEAR 和 SALES 子查询的年份和产品 ID,即使该年份没有销售任何产品。

SELECT PRODUCTS.ProductID, YEARS.SALES_YEAR, SALES.TOTAL_SALES
FROM (
    SELECT ProductID 
    FROM salestable 
    GROUP BY ProductID
     ) AS PRODUCTS 
CROSS JOIN (
    SELECT YEAR(Trans_dt) AS SALES_YEAR 
    FROM salestable 
    WHERE YEAR(Trans_dt) IN @YEARS 
     ) AS YEARS 
LEFT JOIN (
    SELECT ProductID, Year(Trans_dt) as Trans_Year, SUM(salesQTY) AS TOTAL_SALES
    FROM salestable
    GROUP BY Year(Trans_dt)
    ) SALES ON SALES.Trans_Year = YEARS.SALES_YEAR AND SALES.ProductID = PRODUCTS.ProductID

请注意,这假设您在选定的每一年都出售了某物。如果用户输入 1905 作为年份并且没有 1905 的数据,则不会出现该年份。不过这应该不是问题。

【讨论】:

  • 另请注意,您可以 GROUP BY YEAR(Trans_dt) (或大多数任何函数),因此您不需要子查询。
  • 非常感谢。不知道为什么我没有想到这一点。以前没用过cross join,现在确实是个好时机。
  • @user2324065 - 谢谢。我刚刚注意到我在那个 CROSS JOIN 上留下了 ON 子句,这会导致错误。我已将其删除。最初它是一个INNER JOIN ON 1 = 1,实际上与 CROSS JOIN 的工作方式相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
  • 2010-10-26
  • 1970-01-01
  • 1970-01-01
  • 2021-03-07
  • 2018-12-16
  • 2013-05-17
相关资源
最近更新 更多