Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在sql server中每周(每天)获取一个月的数据_Sql_Sql Server - Fatal编程技术网

如何在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将处理它,而不是在数据库对象中硬编码

你能编辑你的帖子来展示你的尝试吗?