首页 新闻 搜索 专区 学院

按周时段展现销售情况

0
[已解决问题] 解决于 2013-01-25 14:19

表里面有很多销售记录,我要把它做成报表,按周时段咱展现一周的销售情况,咱们做呀?

Haydy的主页 Haydy | 初学一级 | 园豆:177
提问于:2011-09-09 21:22
< >
分享
最佳答案
0

楼上的不错,学习了

奖励园豆:5
artwl | 专家六级 |园豆:16526 | 2011-09-13 09:51
其他回答(1)
1

你好,

你是不是需要一个函数~而这个函数的功能大概是在你传入一个datetime的数据列时返回这个datetime所处的星期n位置

如果是,那么在SQL Server里面你可以使用

PRINT DATENAME(dw, GETDATE())
然后你就可以在SELECT那里的FROM子句后面的GROUP BY DATENAME(dw, daatetime列)了~~

dotNetDR_ | 园豆:2058 (老鸟四级) | 2011-09-09 21:28

我需要的结果是如下:

月份  第一周  第二周  第三周  第四周

8       100     3000   4000   2000

9       200     400      2000   2000

像这种

支持(0) 反对(0) Haydy | 园豆:177 (初学一级) | 2011-09-09 21:31

我需要的结果是如下:

月份  第一周  第二周  第三周  第四周    第五周

8月份  100     3000   4000   2000      0

9月份   200     4000       0          0       0

10月份  0          0           0         0        0

像这种

要把每一个月拆分周来统计呀

支持(0) 反对(0) Haydy | 园豆:177 (初学一级) | 2011-09-09 21:34

@于汉中:

源数据表的格式是??

支持(0) 反对(0) dotNetDR_ | 园豆:2058 (老鸟四级) | 2011-09-09 23:10

@dotNetDR_:

哎.一瓶可乐过后.睡不着郁闷.只好做做题了

希望对你有帮助.

--建表
CREATE TABLE #temp_SalesReport (
[Month] datetime not null,
[Amount] money not null
)

DECLARE @MonthDiffer int --月份差
SET @MonthDiffer = 0

DECLARE @Amount money
SET @Amount = 100.00

DECLARE @StartMonth datetime --开始的月份
DECLARE @MenthCOunt int --计算月数 范围{ 1 ... 12 }
SET @StartMonth = CAST('2011-01-01' AS datetime)
SET @MenthCOunt = 12 --模拟一年的销售

DECLARE @MonthDate datetime
SET @MonthDate = DATEADD(dd, -day(@StartMonth) + 1, @StartMonth)

--Debug
--
SELECT @MonthDate

--插数据
WHILE (@MonthDiffer < @MenthCOunt)
BEGIN
INSERT INTO #temp_SalesReport (
[Month], [Amount]
)
VALUES (
@StartMonth, @Amount
)

SET @Amount = @Amount + 100.00

SET @StartMonth = DATEADD(dd, 1, @StartMonth)

SET @MonthDiffer = DATEDIFF(mm, @MonthDate, @StartMonth)
--print @MonthDiffer
END

--Debug
--
SELECT * FROM #temp_SalesReport
--
DELETE FROM #temp_SalesReport

--实现,先计算出月份和第几周
;WITH CTE_1 AS (
SELECT
(
DATENAME(dd, [Month]) + 6) / 7 [WeekOfMonth], -- 加6 是 -1 + 7来的,这列是获取当月的周编号
MONTH([Month]) [MonthForNum], -- 获取月份
--[Month], --Debug时可以取消看结果
[Amount]
FROM
[#temp_SalesReport]
)
--select * from CTE_1 --Debug
,
CTE_2
AS (
SELECT
[MonthForNum],
[WeekOfMonth],
[Amount]
FROM CTE_1
)
--SELECT * FROM CTE_2 --Debug
/*
Debug (最终结果)
SELECT MonthForNum, WeekOfMonth, SUM(Amount) [AmountTotal]
FROM CTE_2
GROUP BY MonthForNum, WeekOfMonth
ORDER BY MonthForNum, WeekOfMonth
*/
--行转列后的最终结果
SELECT
CAST(MonthForNum AS NVARCHAR(2)) + N'月份' [月份],
[1] [第一周],
[2] [第二周],
[3] [第三周],
[4] [第四周],
CASE
WHEN [5] is null THEN CAST(0.00 AS money)
ELSE [5]
END [第五周]
FROM (
SELECT * FROM CTE_2
GROUP BY MonthForNum, WeekOfMonth, Amount
)
[SourceTable]
PIVOT (
SUM([Amount])
FOR [WeekOfMonth] IN (
[1], [2], [3], [4], [5]
)
)
[PivotTable]
效果图


行转列参考
http://www.cnblogs.com/highend/archive/2011/07/15/how_to_using_pivot_and_unpivot.html

支持(0) 反对(0) dotNetDR_ | 园豆:2058 (老鸟四级) | 2011-09-11 02:23

@dotNetDR_:

弱弱问问能否给点豆豆呀...

支持(0) 反对(0) dotNetDR_ | 园豆:2058 (老鸟四级) | 2011-09-11 02:26

@dotNetDR_:要写存储过程吗?

支持(0) 反对(0) Haydy | 园豆:177 (初学一级) | 2011-09-13 10:25

@于汉中:

上面的代码没有用到存储过程噢了~

只是用到DATANAME函数去获取相应的值然后在去做报表之类.

你如果有那里不懂可以提出,我会尽力为你解答

谢谢

支持(0) 反对(0) dotNetDR_ | 园豆:2058 (老鸟四级) | 2011-09-13 15:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册