SSRS信函格式报表如何合并同门店高销量产品至同一信函
SSRS 同门店负责人多高销产品合并为单信函实现方案
你现在生成3封独立信的核心原因是报表分组粒度设到了单产品维度,按以下两步调整即可:
- 首先调整报表分组规则:将最外层父分组的分组字段设为「门店ID+负责人」,不要加入产品相关字段,分组设置中勾选「组分页」,保证每个门店负责人仅对应1个信函页,从根源避免拆分多信。
- 再根据你的技术栈选以下任意一种方式,把同组的高销产品嵌入到信函正文即可。
方案1:不改数据集,用SSRS内置函数实现
适合不想调整现有取数逻辑的场景,直接在信函正文的文本框中写表达式,用LookupSet匹配当前门店+负责人下的所有高销产品,再拼接成要求的HTML格式:
="<p>Hi Doc,</p> <p>非常高兴您为我司产品销量做出了突出贡献,近期调研发现您的门店以下产品销量最高:</p> <ul><li>" & Join( LookupSet( Fields!StoreID.Value & Fields!ResponsiblePerson.Value, Fields!StoreID.Value & Fields!ResponsiblePerson.Value, Fields!ProductName.Value, "你的销售数据集名称" ), "</li><li>" ) & "</li></ul> <p>请您继续保持优异表现。</p> <p>NA Dept.</p>"
注意:写完表达式后,选中文本框内的占位符,在属性中将「标记类型」修改为HTML - 将HTML标记解释为样式,否则标签会直接作为纯文本显示。
方案2:SQL层提前聚合(数据量大时优先选,性能更好)
如果你的数据源是SQL Server 2017及以上版本,直接在取数SQL中用STRING_AGG按门店+负责人维度提前把Top3高销产品拼接成HTML片段,回到报表直接绑定字段即可,示例SQL逻辑:
WITH RankedProduct AS ( SELECT StoreID, ResponsiblePerson, ProductName, ROW_NUMBER() OVER (PARTITION BY StoreID, ResponsiblePerson ORDER BY SalesVolume DESC) AS SalesRank FROM 销售明细数据表 ) SELECT StoreID, ResponsiblePerson, STRING_AGG(CONCAT('<li>', ProductName, '</li>'), '') WITHIN GROUP (ORDER BY SalesRank) AS TopProductHtml FROM RankedProduct WHERE SalesRank <= 3 GROUP BY StoreID, ResponsiblePerson
如果是SQL Server 2016及更早版本,把STRING_AGG替换成FOR XML PATH的字符串拼接写法即可,逻辑一致。
常见踩坑点
- 不要将产品ID、产品名称字段加入信函的父分组条件,否则分组键不一致会自动生成独立信函
- 若需要按销量排序产品,
LookupSet方案要保证数据集本身已经按门店分组、销量倒序排好,STRING_AGG方案直接用WITHIN GROUP指定排序规则即可 - 渲染HTML时不要给文本框开纯文本模式,否则格式会全部失效
内容的提问来源于stack exchange,提问作者SQL Leraner
相关产品推荐
相关产品推荐

