公司报表,求帮助

hanyangjian 2015-06-15 02:22:39

报表是根据条件月份查每天产品生产数量所以列可能不固定,有30天和31天,最好可以根据月份日期显示
如果不存在数据,数量显示为0,如果最后一列增加一个合计,就更完美了。
求高手。
...全文
194 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
HelloWordGirl 2015-06-16
  • 打赏
  • 举报
回复
如果你是用SSRS做报表的话,数据源就是直接拉取成你图这样的,然后使用矩阵,它可以帮你直接完成动态列转行,如果你想写数据源,用于数据库中的执行的话,需要动态列转行。 CREATE TABLE #Temp_9( Pid VARCHAR(20) NULL,--产品ID cid VARCHAR(20) NULL,--客户ID NUMS NUMERIC(18,0) NULL,--数量 DATES DATETIME NULL --日期 ) GO ---插入测试数据 INSERT INTO #Temp_9 SELECT 'A','E',3,'2015-06-01' UNION ALL SELECT 'A','E',4,'2015-06-02' UNION ALL SELECT 'A','E',5,'2015-06-03' UNION ALL SELECT 'A','E',2,'2015-06-04' UNION ALL SELECT 'A','E',3,'2015-06-05' UNION ALL SELECT 'A','E',4,'2015-06-06' UNION ALL SELECT 'A','E',5,'2015-06-07' UNION ALL SELECT 'A','E',2,'2015-06-08' UNION ALL SELECT 'A','E',2,'2015-06-09' UNION ALL SELECT 'A','E',2,'2015-06-10' UNION ALL SELECT 'A','E',2,'2015-06-11' UNION ALL SELECT 'A','E',2,'2015-06-12' UNION ALL SELECT 'A','E',2,'2015-06-13' --SELECT * FROM #Temp_9 DECLARE @a VARCHAR(max), @q VARCHAR(max) SELECT @a=ISNULL(@a+',','')+Quotename(dates) FROM (SELECT DISTINCT convert(varchar(10),dates,120)AS Dates FROM #Temp_9 )AS C SET @q=' select * from #Temp_9 pivot( max(nums) for(dates) in ('+@a+') )as R ' EXEC (@q)
  • 打赏
  • 举报
回复
动态行转列
  IF OBJECT_ID('t_p','u')IS NOT NULL
  DROP TABLE t_p
  GO
  ---建表
  CREATE TABLE t_p(
  	Pid  VARCHAR(20) NULL,--产品ID
  	cid  VARCHAR(20) NULL,--客户ID
  	NUMS  NUMERIC(18,0) NULL,--数量
  	DATES  VARCHAR(20) NULL --日期
  )
  GO
 ---插入测试数据
 INSERT INTO t_p
 (
 	Pid,
 	cid,
 	NUMS,
 	DATES
 )
 
 SELECT 'A' AS N'产品ID','E' AS N'客户ID',2 AS N'数量','2015-06-01' AS N'日期' UNION ALL
 SELECT 'A','E',3,'2015-06-02' UNION ALL
 SELECT 'A','E',4,'2015-06-01' UNION ALL
 SELECT 'A','E',5,'2015-06-02' UNION ALL
 SELECT 'A','E',2,'2015-06-03' UNION ALL
 SELECT 'A','E',3,'2015-06-04' UNION ALL
 SELECT 'A','E',4,'2015-06-05' UNION ALL
 SELECT 'A','E',5,'2015-06-06' UNION ALL
 
 SELECT 'A','E',2,'2015-06-07' UNION ALL
 SELECT 'A','E',2,'2015-06-08' UNION ALL
 SELECT 'A','E',2,'2015-06-09' UNION ALL
 SELECT 'A','E',2,'2015-06-10' UNION ALL
 SELECT 'A','E',2,'2015-06-11' UNION ALL
 SELECT 'A','E',2,'2015-06-10' 

-----动态PIVOT行转列 	
DECLARE @sql_str VARCHAR(8000)
DECLARE @sql_col VARCHAR(8000)
 SELECT @sql_col = ISNULL(@sql_col + ',','') + QUOTENAME(DATES) FROM t_p GROUP BY DATES
 SET @sql_str = '
				 SELECT * FROM (
							 SELECT [Pid],[cid],
									[NUMS],[DATES] 
							 FROM [t_p]
								) p PIVOT 
					 (SUM([NUMS]) FOR [DATES] IN ( '+ @sql_col +') ) AS pvt 
				 ORDER BY pvt.[Pid]'
---打印出动态SQL,测试SQL的正确性(可注释)
 --PRINT (@sql_str)
 ---执行SQL
 EXEC (@sql_str)
要到月底的话,需要在动态SQL之前做匹配处理,比如现在是2015-06-15,那你要到2015-06-30这一列,就要做日期匹配了,先查看,表中2015年6月是不是存在1到30号,不存在的要插入或者其他处理,让数据为零的日期显示出来
hery2002 2015-06-15
  • 打赏
  • 举报
回复
按照日期汇总,然后通过SSRS的Matrix自动生成报表列, 参考 SSRS:按月汇总的动态表头实现-Matrix Control
还在加载中灬 2015-06-15
  • 打赏
  • 举报
回复


DECLARE @SQL VARCHAR(8000)
DECLARE @StartDate VARCHAR(10),@EndDate VARCHAR(10)
SET @StartDate='2015-06-01'--查六月
SET @EndDate=CONVERT(VARCHAR(10),DATEADD(MONTH,1,@StartDate),120)
SET @SQL='SELECT 产品id,客户ID'
SELECT @SQL=@SQL+',SUM(CASE WHEN 日期='''+DateStr+''' THEN 数量 END)['+DateStr+']'
FROM(
SELECT CONVERT(VARCHAR(10),DATEADD(DAY,number,@StartDate),120)DateStr
FROM master..spt_values
WHERE type='P'AND number<DATEDIFF(DAY,@StartDate,@EndDate)
)T
SET @SQL=@SQL+',SUM(数量)[合计]
FROM TB
WHERE 日期>='''+@StartDate+''' AND 日期<'''+@EndDate+'''
GROUP BY 产品id,客户ID'
--PRINT @SQL
EXEC(@SQL)

27,582

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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