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

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 。。。。。

。。。

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

非常感谢大家!



下面是参考脚本。
...全文
303 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)

4,816

社区成员

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

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