9 个解决方案
#1
给些数据吧,否则别人答了,也不是你要的结果,岂不是浪费了时间
#2
while @i<7
begin
select a.cSOCode,sum(b.iQuantity) into #temp_table_1
from SO_SOMain a join SO_SODetails b on a.cSOCode = b.cSOCode
where dDate between @a and @b
group by a.cSOCode
set @a=dateadd(day,1,@b)
set @b=dateadd(day,7,@b)
set @i=@i+1
end
@a和@b是我判断完传的日期,通过循环获得六周的销售数量,我想得到的效果是把这六周的结果放到一张表里
begin
select a.cSOCode,sum(b.iQuantity) into #temp_table_1
from SO_SOMain a join SO_SODetails b on a.cSOCode = b.cSOCode
where dDate between @a and @b
group by a.cSOCode
set @a=dateadd(day,1,@b)
set @b=dateadd(day,7,@b)
set @i=@i+1
end
@a和@b是我判断完传的日期,通过循环获得六周的销售数量,我想得到的效果是把这六周的结果放到一张表里
#3
你这个循环是每次生成一临时表 #temp_table_1
应该是先建好临时表,再循环插入
然后再做行列转换
相关行列转换的例子,请参考:
http://blog.csdn.net/hdhai9451/article/details/5026933
应该是先建好临时表,再循环插入
create table #temp(cSOCode varchar(100),iQuantity int)
...............
while @i<7
begin
insert into #temp
select a.cSOCode,sum(b.iQuantity)
from SO_SOMain a
join SO_SODetails b on a.cSOCode = b.cSOCode
where dDate between @a and @b
group by a.cSOCode
set @a=dateadd(day,1,@b)
set @b=dateadd(day,7,@b)
set @i=@i+1
end
然后再做行列转换
相关行列转换的例子,请参考:
http://blog.csdn.net/hdhai9451/article/details/5026933
#4
你这个不用这么麻烦把,其实你就是想输入任何一个日期,就自动把这个日期所在的周,以及后几个周的日期计算出来,按后分别计算每个周的汇总值是吧。
我觉得你这样通过一个循环来计算,效率肯定是相对较差的。
我觉得你这样通过一个循环来计算,效率肯定是相对较差的。
#5
对了,你的周的定义是怎么样的,只是普通周的概念吗,比如传入参数为2013-08-08,这天是周四,那么是否是从2013-08-05 周一到2013-08-11 周日 计算为一周呢?
#6
不是 是从输入日期开始到周日算第一周 之后每周都是七天 这个我之前都做好判断了
#7
没太看懂怎么行变列列变行
cSOCode,cCusCode,cCusName,cInvCode,cInvName,cInvCName,cSTName 表1
cSOCode,iQuantity表2
这两个表能换吗
#9
DECLARE @date DATETIME
SET @date = '2013-08-28'
;WITH num AS
(
SELECT id = 1 UNION ALL
SELECT id = 2 UNION ALL
SELECT id = 3 UNION ALL
SELECT id = 4 UNION ALL
SELECT id = 5 UNION ALL
SELECT id = 6
),
cte_week AS
(
select
id = '第'+LTRIM(b.id)+'周',
begindate = CASE b.id WHEN 1 THEN @date ELSE DATEADD(DAY, -(DATEPART(WEEKDAY, @date)-2), DATEADD(week, b.id-1, a.begindate)) END,
enddate = DATEADD(DAY, -(DATEPART(WEEKDAY, @date)-1)+1, DATEADD(week, b.id, a.begindate))
FROM (SELECT begindate = @date) a
CROSS JOIN num b
)
--SELECT * FROM cte_week
SELECT * FROM
(
SELECT
a.cSOCode ,
c.id,
totalQuantity = SUM(b.iQuantity)
FROM SO_SOMain a
INNER JOIN SO_SODetails b
ON a.cSOCode = b.cSOCode
INNER JOIN cte_week c
ON dDate >= c.begindate AND dDate < c.enddate
GROUP BY a.cSOCode, c.id
) m
PIVOT
(
MAX(totalQuantity) FOR id IN([第1周],[第2周],[第3周],[第4周],[第5周],[第6周])
) n
#1
给些数据吧,否则别人答了,也不是你要的结果,岂不是浪费了时间
#2
while @i<7
begin
select a.cSOCode,sum(b.iQuantity) into #temp_table_1
from SO_SOMain a join SO_SODetails b on a.cSOCode = b.cSOCode
where dDate between @a and @b
group by a.cSOCode
set @a=dateadd(day,1,@b)
set @b=dateadd(day,7,@b)
set @i=@i+1
end
@a和@b是我判断完传的日期,通过循环获得六周的销售数量,我想得到的效果是把这六周的结果放到一张表里
begin
select a.cSOCode,sum(b.iQuantity) into #temp_table_1
from SO_SOMain a join SO_SODetails b on a.cSOCode = b.cSOCode
where dDate between @a and @b
group by a.cSOCode
set @a=dateadd(day,1,@b)
set @b=dateadd(day,7,@b)
set @i=@i+1
end
@a和@b是我判断完传的日期,通过循环获得六周的销售数量,我想得到的效果是把这六周的结果放到一张表里
#3
你这个循环是每次生成一临时表 #temp_table_1
应该是先建好临时表,再循环插入
然后再做行列转换
相关行列转换的例子,请参考:
http://blog.csdn.net/hdhai9451/article/details/5026933
应该是先建好临时表,再循环插入
create table #temp(cSOCode varchar(100),iQuantity int)
...............
while @i<7
begin
insert into #temp
select a.cSOCode,sum(b.iQuantity)
from SO_SOMain a
join SO_SODetails b on a.cSOCode = b.cSOCode
where dDate between @a and @b
group by a.cSOCode
set @a=dateadd(day,1,@b)
set @b=dateadd(day,7,@b)
set @i=@i+1
end
然后再做行列转换
相关行列转换的例子,请参考:
http://blog.csdn.net/hdhai9451/article/details/5026933
#4
你这个不用这么麻烦把,其实你就是想输入任何一个日期,就自动把这个日期所在的周,以及后几个周的日期计算出来,按后分别计算每个周的汇总值是吧。
我觉得你这样通过一个循环来计算,效率肯定是相对较差的。
我觉得你这样通过一个循环来计算,效率肯定是相对较差的。
#5
对了,你的周的定义是怎么样的,只是普通周的概念吗,比如传入参数为2013-08-08,这天是周四,那么是否是从2013-08-05 周一到2013-08-11 周日 计算为一周呢?
#6
不是 是从输入日期开始到周日算第一周 之后每周都是七天 这个我之前都做好判断了
#7
没太看懂怎么行变列列变行
cSOCode,cCusCode,cCusName,cInvCode,cInvName,cInvCName,cSTName 表1
cSOCode,iQuantity表2
这两个表能换吗
#8
行列转换是指针对同一个表进行行列变化,你看看我的例子就明白了
http://blog.csdn.net/dotnetstudio/article/details/9790671
http://blog.csdn.net/dotnetstudio/article/details/9790671
#9
DECLARE @date DATETIME
SET @date = '2013-08-28'
;WITH num AS
(
SELECT id = 1 UNION ALL
SELECT id = 2 UNION ALL
SELECT id = 3 UNION ALL
SELECT id = 4 UNION ALL
SELECT id = 5 UNION ALL
SELECT id = 6
),
cte_week AS
(
select
id = '第'+LTRIM(b.id)+'周',
begindate = CASE b.id WHEN 1 THEN @date ELSE DATEADD(DAY, -(DATEPART(WEEKDAY, @date)-2), DATEADD(week, b.id-1, a.begindate)) END,
enddate = DATEADD(DAY, -(DATEPART(WEEKDAY, @date)-1)+1, DATEADD(week, b.id, a.begindate))
FROM (SELECT begindate = @date) a
CROSS JOIN num b
)
--SELECT * FROM cte_week
SELECT * FROM
(
SELECT
a.cSOCode ,
c.id,
totalQuantity = SUM(b.iQuantity)
FROM SO_SOMain a
INNER JOIN SO_SODetails b
ON a.cSOCode = b.cSOCode
INNER JOIN cte_week c
ON dDate >= c.begindate AND dDate < c.enddate
GROUP BY a.cSOCode, c.id
) m
PIVOT
(
MAX(totalQuantity) FOR id IN([第1周],[第2周],[第3周],[第4周],[第5周],[第6周])
) n