【问题标题】:SSRS - Struggling with GroupingSSRS - 与分组斗争
【发布时间】:2020-07-17 16:05:03
【问题描述】:

我有一张像这样的桌子......

我需要创建这样的报告

但不知道如何在 SSRS 中创建列...任何帮助将不胜感激。

【问题讨论】:

  • 这不会是 SSRS 中的简单成就,因为您在列中分组。最好在 SQL 中进行部分聚合,然后在 SSRS 中进行数据透视。
  • 确保您拥有所有日期的最佳方法是使用日期表(计数表将起作用)作为报告的驱动程序,这样您就可以加入它然后按月份分组.否则,对于没有数据的月份,将不会出现任何列。

标签: sql-server reporting-services grouping


【解决方案1】:

只需对您的数据稍作更改,您就可以在 SSRS 中轻松做到这一点。

假设您的数据当前位于一个看起来像示例的表中,那么您可以在数据集查询中使用类似的内容..

SELECT Account, SalesPerson, Cost, Product, 'Expected' as Measure, ExpectedCloseDate as ActivityDate
    FROM myTable WHERE ExpectedCloseDate IS NOT NULL
UNION ALL
SELECT Account, SalesPerson, Cost, Product, 'Actual' as Measure, ActualCloseDate as ActivityDate
    FROM myTable WHERE ActualCloseDate IS NOT NULL

  1. 然后在您的报告中,添加一个矩阵
  2. 添加按客户、销售人员和产品分组的行组
  3. 添加按度量分组的列组
  4. 将父列组添加到按分组的度量列组 年月

完成此操作后,将“成本”字段作为数据字段拖放到矩阵上,这应该是日期上的一些格式以外的内容。

如果你还在苦苦挣扎,请告诉我,我会发布完整的答案,我现在不在我的电脑前(现在是午夜!)

【讨论】:

  • 这就是我喜欢 SQL 的地方!给猫剥皮的方法有很多!这是完美的,如此简单!谢谢艾伦!
  • 嗨艾伦,出于某种原因,某些列重复了,例如我看到 3 x 2020-04 列,前两个都有预期和实际,第三个只有实际...为什么会这样,文本中的任何地方都没有空格
  • 啊...我最初格式化了父组中的日期字段。我删除了它并在查询中将 Format(ActivityDate, 'MM-yyyy') 作为 ActivityDate 并解决了问题
【解决方案2】:

不是 SSRS 报告方面的专家,但可以在 SQL 中完成实际的数据透视。下面的解决方案使用Common Table Expression's (CTE's) 和pivot 关键字。该解决方案不是最动态的解决方案,但它涵盖了您的示例数据。

-- create sample data
declare @data table
(
    Account nvarchar(15),
    SalesPerson nvarchar(15),
    Cost int,
    Product nvarchar(15),
    ExpectedCloseDate date,
    ActualCloseDate date
);

insert into @data (Account, SalesPerson, Cost, Product, ExpectedCloseDate, ActualCloseDate) values
('ABC House',   'John Doe',     120,    'Blocks',       '2020-02-03', '2020-02-03'),
('Pizza House', 'Jose Guava',   10,     'Boxes',        '2020-04-04', '2020-04-24'),
('The Hanger',  'John Doe',     10,     'Wings',        '2020-02-03', '2020-06-24'),
('The Store',   'John Doe',     10,     'Catnip',       '2020-02-03',  null       ),
('The Store',   'Jose Guava',   15,     'Boxes',        '2020-03-04', '2020-05-24'),
('WangTai',     'Pete Ringer',  20,     'Lettuce',      '2020-04-01', '2020-04-04'),
('WangTai',     'Pete Ringer',  22,     'Paper Plates', '2020-05-01',  null       ),
('Woolies',     'Pete Ringer',  20,     'Catnip',       '2020-03-04', '2020-03-04');

解决方案概述:

  1. 将日期转换为月份。
  2. 调整预期成本。
  3. 以实际成本为中心。
  4. 将所有内容结合在一起。

解决方案:

-- solution 
with dataMonths as
(
    select  d.Account,
            d.SalesPerson,
            d.Product,
            d.Cost,
            month(d.ExpectedCloseDate) as 'ExpectedMonth',
            month(d.ActualCloseDate) as 'ActualMonth'
    from @data d
),
dataExpected as
(
    select  p.Account,
            p.SalesPerson,
            p.Product,
            [2] as 'ExpFeb20',
            [3] as 'ExpMar20',
            [4] as 'ExpApr20',
            [5] as 'ExpMay20',
            [6] as 'ExpJun20',
            [7] as 'ExpJul20'
    from dataMonths dm
    pivot ( sum(dm.Cost) for ExpectedMonth in ([2], [3], [4], [5], [6], [7]) ) p
),
dataActual as
(
    select  p.Account,
            p.SalesPerson,
            p.Product,
            [2] as 'ActFeb20',
            [3] as 'ActMar20',
            [4] as 'ActApr20',
            [5] as 'ActMay20',
            [6] as 'ActJun20',
            [7] as 'ActJul20'
    from dataMonths dm
    pivot ( sum(dm.Cost) for ActualMonth in ([2], [3], [4], [5], [6], [7]) ) p
)
select  dm.Account,
        dm.SalesPerson,
        dm.Product,
        de.ExpFeb20,
        da.ActFeb20,
        de.ExpMar20,
        da.ActMar20,
        de.ExpApr20,
        da.ActApr20,
        de.ExpMay20,
        da.ActMay20,
        de.ExpJun20,
        da.ActJun20,
        de.ExpJul20,
        da.ActJul20
from dataMonths dm
join dataExpected de
    on  de.Account = dm.Account
    and de.SalesPerson = dm.SalesPerson
    and de.Product = dm.Product
join dataActual da
    on  da.Account = dm.Account
    and da.SalesPerson = dm.SalesPerson
    and da.Product = dm.Product;

这给了我一些非常接近最终报告的东西:

Account         SalesPerson     Product         ExpFeb20    ActFeb20    ExpMar20    ActMar20    ExpApr20    ActApr20    ExpMay20    ActMay20    ExpJun20    ActJun20    ExpJul20    ActJul20
--------------- --------------- --------------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
ABC House       John Doe        Blocks          120         120         NULL        NULL        NULL        NULL        NULL        NULL        NULL        NULL        NULL        NULL
Pizza House     Jose Guava      Boxes           NULL        NULL        NULL        NULL        10          10          NULL        NULL        NULL        NULL        NULL        NULL
The Hanger      John Doe        Wings           10          NULL        NULL        NULL        NULL        NULL        NULL        NULL        NULL        10          NULL        NULL
The Store       John Doe        Catnip          10          NULL        NULL        NULL        NULL        NULL        NULL        NULL        NULL        NULL        NULL        NULL
The Store       Jose Guava      Boxes           NULL        NULL        15          NULL        NULL        NULL        NULL        15          NULL        NULL        NULL        NULL
WangTai         Pete Ringer     Lettuce         NULL        NULL        NULL        NULL        20          20          NULL        NULL        NULL        NULL        NULL        NULL
WangTai         Pete Ringer     Paper Plates    NULL        NULL        NULL        NULL        NULL        NULL        22          NULL        NULL        NULL        NULL        NULL
Woolies         Pete Ringer     Catnip          NULL        NULL        20          20          NULL        NULL        NULL        NULL        NULL        NULL        NULL        NULL

【讨论】:

  • 这非常接近我的需要,如果我的其他建议没有成功,这将是我将使用的。非常感谢您花时间这么详细地回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
  • 2018-05-23
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多