With T
创新互联建站一直通过网站建设和网站营销帮助企业获得更多客户资源。 以"深度挖掘,量身打造,注重实效"的一站式服务,以网站制作、网站建设、移动互联产品、成都营销网站建设服务为核心业务。10年网站制作的经验,使用新网站建设技术,全新开发出的标准网站,不但价格便宜而且实用、灵活,特别适合中小公司网站制作。网站管理系统简单易用,维护方便,您可以完全操作网站资料,是中小公司快速网站建设的选择。
As
(
Select ID,结束月,相差月 From TT
Union All
Select T.ID,Dateadd(M,-1,T.结束月),T.相差月-1 From TT Inner Join T On
TT.id=T.id Where T.相差月1
)
Select ID,结束月 From T
Order By id,结束月
--TT是你的表名
--SQL2005或以上版本
怎么改题目了?搞的我还把开始的要求给算出来了,如下:
select
a.月份,
a.本月收入总额,
case when b.本月收入总额=0 or b.本月收入总额 IS null then null else
(a.本月收入总额-b.本月收入总额)/b.本月收入总额*100 end 收入增长百分比,
a.本月支出总额,
case when b.本月支出总额=0 or b.本月支出总额 IS null then null else
(a.本月支出总额-b.本月支出总额)/b.本月支出总额*100 end 支出增长百分比,
a.本月余额,
case when b.本月余额=0 or b.本月余额 IS null then null else
(a.本月余额-b.本月余额)/b.本月余额*100 end 余额增长百分比
from
(
select
MONTH(日期) 月份,
isnull(SUM(收入金额),0) 本月收入总额,
isnull(SUM(支出金额),0) 本月支出总额,
isnull(SUM(收入金额),0)-isnull(SUM(支出金额),0) 本月余额
from 收支表
group by MONTH(日期)
) a
left join
(
select
MONTH(日期) 月份,
isnull(SUM(收入金额),0) 本月收入总额,
isnull(SUM(支出金额),0) 本月支出总额,
isnull(SUM(收入金额),0)-isnull(SUM(支出金额),0) 本月余额
from 收支表
group by MONTH(日期)
) b
on a.月份=b.月份+1
order by a.月份 desc
搞到最后才发现你是ACCESS数据库,晕死,那以上SQL Server 代码可能有些地方要修改
比如:case when then else end语句,不知ACCESS是否支持;
left join可能要改成left outer join;
isnull()函数,不知access是否支持;
month()函数,不知access是否支持;
用ACCESS完成这么复杂的运算,的确困难.
补充,用case主要是用来排除0和空值,比如,你6月份的收入为0,7月份的收入3500,那么收入增长百分比就是3500/0,结果是无穷大,你在ACCESS中怎么排除这种情况?
select * from xxxx where datediff(m,dt1,dt2)
datediff:日期比较函数,SQL server自带的,会将比较的两个日期比较部分的差值返回,m表示比较月
SQL 同期对比月?
这个 同期的期, 是 年? 半年? 还是季度?
如果是年的话。就是 用 需要比较的日期 减去一年的 操作来处理。
如果是 半年的话, 用 需要比较的日期 减去6个月的 操作来处理。
如果是 季度的话, 用 需要比较的日期 减去3个月的 操作来处理。
至于 日期如何减 , 例如减少 6 个月。
Oracle 使用 ADD_MONTHS( 日期, -6 )
SQL Server 使用 DATEADD( mm, 日期, -6 )
MySQL 使用 DATE_SUB( 日期, INTERVAL 6 MONTH)
至于 如何多个字段确定一条数据。
这个不大清楚你的表是如何设计的。
一般情况下,是一个主键确定一条数据。
CREATE TABLE test_liupeng841121(
name VARCHAR(10),
year INT,
month INT,
sl INT
);
go
INSERT INTO test_liupeng841121
SELECT '福田', 2010, 11, 72 UNION ALL
SELECT '东本', 2010, 11, 85 UNION ALL
SELECT '古田', 2010, 11, 123 UNION ALL
SELECT '福田', 2010, 12, 96 UNION ALL
SELECT '东本', 2010, 12, 34 UNION ALL
SELECT '福田', 2011, 1, 78
go
SELECT
T_Now.name AS 名称,
T_Now.year AS 年,
T_Now.month AS 月,
T_Now.sl AS 当月数据,
T_Prev.sl AS 上月数据
FROM
test_liupeng841121 T_Now LEFT JOIN
test_liupeng841121 T_Prev
ON (
T_Now.name = T_Prev.name
AND (
(T_Now.year = T_Prev.year AND T_Now.month = T_Prev.month + 1)
OR
(T_Now.year = T_Prev.year + 1 AND T_Now.month = 1 AND T_Prev.month = 12)
)
)
ORDER BY
T_Now.name, T_Now.year, T_Now.month
month(getdate())-month(createdate)-(case when day(getdate())day(createdate) then 1 else 0 end)
可以完成,思路如下:
通过pid 商品编码分组,得到销售日期的每个月列,后用sum(case Fact_m WHEN 月份 then 数量end)来操作即可.
--年度售额:
select pid 商品编码
,isnull(convert(dec(18,2),sum(case Fact_m WHEN '01' then cCost end)),0) 'countCost_1'
,isnull(convert(dec(18,2),sum(case Fact_m WHEN '02' then cCost end)),0) 'countCost_2'
,isnull(convert(dec(18,2),sum(case Fact_m WHEN '03' then cCost end)),0) 'countCost_3'
,isnull(convert(dec(18,2),sum(case Fact_m WHEN '04' then cCost end)),0) 'countCost_4'
,isnull(convert(dec(18,2),sum(case Fact_m WHEN '05' then cCost end)),0) 'countCost_5'
,isnull(convert(dec(18,2),sum(case Fact_m WHEN '06' then cCost end)),0) 'countCost_6'
,isnull(convert(dec(18,2),sum(case Fact_m WHEN '07' then cCost end)),0) 'countCost_7'
,isnull(convert(dec(18,2),sum(case Fact_m WHEN '08' then cCost end)),0) 'countCost_8'
,isnull(convert(dec(18,2),sum(case Fact_m WHEN '09' then cCost end)),0) 'countCost_9'
,isnull(convert(dec(18,2),sum(case Fact_m WHEN '10' then cCost end)),0) 'countCost_10'
,isnull(convert(dec(18,2),sum(case Fact_m WHEN '11' then cCost end)),0) 'countCost_11'
,isnull(convert(dec(18,2),sum(case Fact_m WHEN '12' then cCost end)),0) 'countCost_12'
,isnull(convert(dec(18,2),sum(cCost))) 'countTotal'
from Tab group by pid
--Fact_m 指的就是销售日期[月],最后还有一列为年度总计
希望能帮到你!