如何在sql server中每周(每天)获取一个月的数据
我的数据如下:如何在sql server中每周(每天)获取一个月的数据,sql,sql-server,Sql,Sql Server,我的数据如下: Docdate Qty Amount ----------------------------------- 2014/08/01(Friday) 5 100 2014/08/03(Sunday) 5 100 2014/08/04(Monday) 8 100 2014/08/10(Sunday) 8 100 2014/08/11(Monday) 8 100 2014/
Docdate Qty Amount
-----------------------------------
2014/08/01(Friday) 5 100
2014/08/03(Sunday) 5 100
2014/08/04(Monday) 8 100
2014/08/10(Sunday) 8 100
2014/08/11(Monday) 8 100
2014/08/17(Sunday) 8 100
2014/08/18(Monday) 8 100
2014/08/24(Sunday) 8 100
2014/08/25(Monday) 8 100
2014/08/31(Sunday) 8 100
我想使用以下模板对存储过程进行常规设置:
Item QtyWeek1(1-3) QtyWeek2(4-10) QtyWeek3(11-17) QtyWeek4(18-24) QtyWeek5(25-31)
A 10 16 16 16 16
B - - - - -
在存储过程中可以这样做吗
在Crystal Report中可以这样做吗?如果是,应显示哪些存储过程列
谢谢如果您选择Docdate DATETIME列类型,请尝试此解决方案
SELECT item, SUM(CASE WHEN DATEPART(wk, Docdate) BETWEEN 1 AND 3 THEN Qty ELSE 0 END) AS qtyWeek1,
SUM(CASE WHEN DATEPART(wk, Docdate) BETWEEN 4 AND 10 THEN Qty ELSE 0 END) AS qtyWeek2,
SUM(CASE WHEN DATEPART(wk, Docdate) BETWEEN 11 AND 17 THEN Qty ELSE 0 END) AS qtyWeek3,
SUM(CASE WHEN DATEPART(wk, Docdate) BETWEEN 18 AND 24 THEN Qty ELSE 0 END) AS qtyWeek4,
SUM(CASE WHEN DATEPART(wk, Docdate) BETWEEN 25 AND 31 THEN Qty ELSE 0 END) AS qtyWeek5
FROM YouTable
GROUP BY item
这一点也不容易。我想你还有一个列名项目,你希望总是有五个星期,所以我不得不考虑额外的列YYYYMM包含周的月份。 那么查询将是:
select ITEM, MONTH_YEAR, [1] WEEK1, [2] WEEK2, [3] WEEK3, [4] WEEK4, [5] WEEK5
from (
select
ITEM,
YEAR(DATE1)*100+MONTH(DATE1) MONTH_YEAR,
1 + WEEK - WEEK0 WEEK,
sum(Qty) Qty
from Table1 t1
cross apply (SELECT cast(Replace(LEFT(DocDate,10),'/','-') as date)) N(DATE1)
cross apply (SELECT DATEPART(WEEK, DATEADD(DAY, -1, DATE1))) T(WEEK)
cross apply (SELECT DATEPART(WEEK, DateAdd(day, -1, DateAdd(month, MONTH(DATE1) - 1, DateAdd(Year, YEAR(DATE1)-1900, 0))))) U(WEEK0)
group by WEEK, YEAR(DATE1)*100+MONTH(DATE1), WEEK0, ITEM
) A
pivot (sum(QTY) FOR WEEK in ([1],[2],[3],[4],[5])) B
词汇表:
- DATE1表示日期类型中DocDate列的转换
- WEEK表示一周的编号
- WEEK0表示当月第一周的编号
因为您有crystal reports,所以不会在数据库中执行交叉表。在crystal report中执行此操作 如果您查看任何人关于这方面的常规建议,它是:在报告工具中执行轴心操作 一般的解决办法是: 向现有记录集中添加一列,称为
weeknumber
将您现有的DocDate
映射到周数(您需要解释规则,即一周何时开始,第1周是什么等,然后我可以建议一些代码)
在crystal reports中,创建以新列weeknumber
为轴心的交叉表报表
这样,如果您有2或20列,crystal将处理它,而不是在数据库对象中硬编码 你能编辑你的帖子来展示你的尝试吗?