如何实现水晶报表 同时按照天和周统计?

adandelion 2011-05-26 04:04:15

如何实现水晶报表 同时按照天和周统计?

我的是水晶报表专业版11

(一)需求:在指定日期段内显示每日和每周报表:
(1)报表列是产品的列表
(2)报表行是某个时间段内,比如从2011-05-22 到 2011-08-10 期间按照天统计的产品销售量,每周最后一天后紧跟着是这周的销量汇总。


下面是报表效果:

产品名称 2011-05-22 2011-05-23 2011-05-24 2011-05-25 2011-05-26 2011-05-27 2011-05-28 一周汇总 2011-05-29 2011-05-30.。。。 2011-06-04 一周汇总 。。。。。

产品1 1 0 0 0 0 2 3 5 1 2 1 4 。。。。。

产品2 2 0 0 0 0 2 3 6 1 1 0 2 。。。。。

。。。

问题:我现在能把每日的汇总放进去了,但是不知道如何在每周最后一天后面增加一列“一周汇总",这个如何加呢?

非常感谢大家!



下面是参考脚本。
...全文
312 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿泰 2011-05-27
  • 打赏
  • 举报
回复
如果列数太多,用动态SQL确实是难实现
那还是回到交叉表的形式来。
数据规整出来是这样的:


所谓的小难点就是那个周统计,你看我的标注其实应该能明白处理,呵呵。
其中
select year(SaleDate) saleYear, DATEPART (week,SaleDate) SaleWeek,N'周末汇总' AS saledate,ProductId,sum(SaleCount) as SaleCount
from TableProductSales
group by year(SaleDate) , DATEPART (week,SaleDate),productid

N'周末汇总' AS saledate 这里

前面加上一个Max(SaleDate),应该就能取到当周的最后一天。转换为字符型和文字拼在一起
这样在显示的时候,他会顺序显示在每周最后一天的后面。
注意因为字段类型的问题,对应的日期列要转换为字符型。

当然,我的表格只是示例,前面还要加上一些别的字段的,如productid之类。

最后放在水晶报表里后,用公式把界面上显示的如 2011-5-7-周末汇总 处理成“周末汇总”即可
显示界面上的处理。而不是数据层面的。

另外,2011-5-7转换为的字符的时候,最好转换为2011-05-07这种,否则可能在排序上错乱

2011-5-7在字符模式下可能是大于2011-5-12的


说的有点乱,不知道有感觉不,呵呵

阿泰 2011-05-27
  • 打赏
  • 举报
回复
Good luck :)
adandelion 2011-05-27
  • 打赏
  • 举报
回复
成功了!再次对babyt说一声,非常感谢你的热情帮助。

根据我的经验,觉得水晶报表可能可以实现的,但是我不会:),谢谢了!

另外通过这件事,看来我的沟通能力还得改进,应该尽可能把有效信息给对方,如果我能把“标题”的问题说清楚的话,那可能babyt早就能回答我的要点了,这样也能节babyt的时间的

再次表示非常感谢!!

adandelion 2011-05-27
  • 打赏
  • 举报
回复
好,我再试试,不好意思:)
阿泰 2011-05-27
  • 打赏
  • 举报
回复
注意

currentfieldvalue,不是字段名

仔细看14楼。
adandelion 2011-05-27
  • 打赏
  • 举报
回复
不行,表头列显示的都是 “2011-05-22”了。

2011-05-22在数据库里是第一条记录。
http://images.cnblogs.com/cnblogs_com/adandelion/37772/o_Datajpg4JPG.jpg
adandelion 2011-05-27
  • 打赏
  • 举报
回复

http://images.cnblogs.com/cnblogs_com/adandelion/37772/o_Datajpg3.jpg

这是图片。你说的那个公式问题,我不是很清楚,我现在试试啊。谢谢了
adandelion 2011-05-27
  • 打赏
  • 举报
回复
公司远程桌面上网太慢了,传图片必须要传到邮箱中转下。稍等
阿泰 2011-05-27
  • 打赏
  • 举报
回复
一般来说,这样处理就可以了。

接13楼。

在交叉表上面(不是在交叉表专家里)
在日期的那个字段上,点右键,设置字段格式,公用标签里,应该有个“显示为”之类的提示标签
点击后面的x+2按钮,进入公式编辑界面,输入

if len(currentfieldvalue)>10 then
"周汇总"
else
currentfieldvalue

这样应该就可以了
阿泰 2011-05-27
  • 打赏
  • 举报
回复
不要做公式,直接把 {Command.SaleDate} 放进去。
然后截预览后的效果图
adandelion 2011-05-27
  • 打赏
  • 举报
回复
下面是我做的公式字段的信息

if len({Command.SaleDate})>10 then
"周汇总"
else
{Command.SaleDate}

最终看到的效果 “周汇总”只有一列了。而不是紧跟着每周最后一天有一个“周汇总”列。
http://images.cnblogs.com/cnblogs_com/adandelion/37772/o_Datajpg.jpg
http://images.cnblogs.com/cnblogs_com/adandelion/37772/o_Datajpg2.jpg


阿泰 2011-05-27
  • 打赏
  • 举报
回复
那我们的目标是一致的,现在你既然已经拼接好了“ 2011-5-7-周末汇总 ”这样的值
那么,如果你不用下面的处理“我使用公式字段,判断 saledate 长度如果大于10”这样的判断
把直接字段拖进去后,交叉表出来的效果是怎样的?截图看看。呵呵
adandelion 2011-05-27
  • 打赏
  • 举报
回复
"最后放在水晶报表里后,用公式把界面上显示的如 2011-5-7-周末汇总 处理成“周末汇总”即可
显示界面上的处理。而不是数据层面的。"
-->这才是我的问题的核心,我也尝试过了的,不过是不行的。我使用公式字段,判断 saledate 长度如果大于10,那就返回“周汇总”

最终看到的效果 “周汇总”只有一列了。而不是紧跟着每周最后一天有一个“周汇总”列。
adandelion 2011-05-27
  • 打赏
  • 举报
回复
非常感谢您的再次回复,其实你这个方法我也想到了。见如下脚本:

if object_id('F_GetSunday','fn') is not null
drop function F_GetSunday
go

-- =============================================
-- Author: <Author,Welly>
-- Create date: <Create Date,2011-05-25,>
-- Description: <Description,Get last day of week,>
-- =============================================
CREATE FUNCTION F_GetSunday(@year INT,@w int)
returns NVARCHAR(10)
as
begin
declare @rq datetime
set @rq=CAST(@year AS varchar)+'0101'
select @rq=max(dateadd(DD,number,@rq))
from master..spt_values where type='p' and datepart(week,dateadd(DD,number,@rq))=@w and number<365
return convert(nvarchar(10),@rq,121)
end
GO




select a.saleYear,a.SaleWeek,a.ProductId,a.SaleDate,a.SaleCount
from (
select year(SaleDate) saleYear, DATEPART (week,SaleDate) SaleWeek,convert(nvarchar(10),SaleDate,121) as SaleDate,ProductId,SaleCount
from TableProductSales

union all
select year(SaleDate) saleYear, DATEPART (week,SaleDate) SaleWeek,dbo.F_GetSunday(year(SaleDate),DATEPART (week,SaleDate))+N'周汇总' AS saledate,ProductId,sum(SaleCount) as SaleCount
from TableProductSales

group by year(SaleDate) , DATEPART (week,SaleDate),productid
) as a

order by a.saleYear,a.SaleWeek,a.ProductId,saledate

这还是不满足我说的那个问题,每周之后紧跟的汇总的标题问题,这个标题不能按照需求那样去做的(需求里周汇总的标题是固定的“周汇总”)。

备注:我在获得每周最后一天的问题上 很明显没有你做的好:)性能很烂的!
adandelion 2011-05-26
  • 打赏
  • 举报
回复
babyt你好,感谢您的回答!
有没有别的联系方式?QQ或者邮件什么的?或者我把我的想法直接写在哪个帖子里,你在帖子里直接回复也可以的。

及时用行专列的SQL,因为列不固定(日期天数不固定”)所以也无法用水晶报表里的标准报表来实现吧?

你说的数据规整是指什么?能具体点吗?
adandelion 2011-05-26
  • 打赏
  • 举报
回复
忘记说谢谢了:)
谢谢babyt的回答。
adandelion 2011-05-26
  • 打赏
  • 举报
回复

我可以把日报表和周报表的东西放在一起

select a.saleYear,a.SaleWeek,a.ProductId,a.SaleDate,a.SaleCount
from (
select year(SaleDate) saleYear, DATEPART (week,SaleDate) SaleWeek,convert(nvarchar(10),SaleDate,121) as SaleDate,ProductId,SaleCount
from TableProductSales
union all
select year(SaleDate) saleYear, DATEPART (week,SaleDate) SaleWeek,N'周末汇总' AS saledate,ProductId,sum(SaleCount) as SaleCount
from TableProductSales
group by year(SaleDate) , DATEPART (week,SaleDate),productid
) as a

order by a.saleYear,a.SaleWeek,a.ProductId,saledate


但是 所有的汇总 列名都是”周末汇总“,放进水晶报表后,这些列就只剩一列”周末汇总“了。而不是一周一次汇总了。

你的建议是用标准表做?直接用SQL弄成行转列?但是这里的日期太多了,行专列的时候拼接脚本很长的 用一个NVARCHAR的变量是存不下的。
阿泰 2011-05-26
  • 打赏
  • 举报
回复
这个用交叉表比较难实现,要实现也是需要做一些数据规整的
现在你既然已经用SQL实现出来了,那为什么不直接用这个SQL来实现呢
当然,一句SQL可能有点困难
就像你的demo一样,把你最终的结果写成一个事实表,直接用这个表做一个普通的列表清单就可以。
adandelion 2011-05-26
  • 打赏
  • 举报
回复
我是纯水晶报表专业版11开发,不是.NET里的集成的水晶报表。
adandelion 2011-05-26
  • 打赏
  • 举报
回复
晕啊,文字效果变形了。效果图可以看这里,
http://images.cnblogs.com/cnblogs_com/adandelion/37772/o_xiaoguotu.jpg
加载更多回复(1)
Crystal Reports 9.2 中文版(水晶报表) 下载,,软件版本:9.2.0.448不过现已出了Crystal Reports Professional v9.2.2.634 (c) Crystal Decisions,有足够的空间就提供.这是一个很不错的报表控件,我相信很多朋友都听说过吧!Crystal Reports 用于处理数据库,帮助用户分析和解释重要信息。使用 Crystal Reports 可以方便地创建简单报表,同时它也提供了创建复杂或专用的报表所需的整套工具。 创建所能想象的任何报表 Crystal Reports几乎可以从任何数据源生成您需要的报表。内置报表专家在您生成报表和完成一般的报表任务过程中,会一步一步地指导您进行操作。报表专家通过公式、交叉表、子报表和设置条件格式帮助表现数据的实际意义,揭示可能被隐藏掉的重要关系。如果文字和数字确实不够充分,则用地理地图和图形进行形象的信息交流。 将报表扩展到 Web Crystal Reports 的灵活性并未停留在创建报表这一功能上 ?您可以用各种各样的格式发布报表,包括用 Microsoft 的 Word 和 Excel 发布、通过电子邮件甚至 Web 发布。高级的 Web 报表功能允许工作组中的其他成员在他们自己的 Web 浏览器中查看或更新共享报表。 将报表并入应用程序通过将 Crystal Reports 的报表处理功能整合到自己的数据库应用程序中,应用程序和 Web 开发人员可以节省开发时间并满足用户的需求。Crystal Reports 支持大多数流行的开发语言,可以方便地在任何应用程序中添加报表。 不论您是 IT 行业的站点管理员,还是营销推广经理,也无论您是金融业的数据库管理员还是 CEO,Crystal Reports 都堪称是一个功能强大的工具,它可以帮助每一个人分析、解释重要信息。感谢 revenant 上传!

4,816

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 图表区
社区管理员
  • 图表区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧