Oracle语句求解~高手进
问题是这样的有一个bill表bill有字段saledate(交易日期)、totalmoney(交易总金额)求如何根据时间分组,并且求出当天的交易平均数、昨天的交易平均数、...
问题是这样的
有一个bill表 bill有字段 saledate(交易日期) 、 totalmoney(交易总金额)
求如何根据时间分组,并且求出当天的交易平均数、昨天的交易平均数 、去年当天的交易平均数 要求时间格式为(yyyy-MM-dd)
查询格式如下
时间 今天平均交易金额 昨天的交易平均数 去年当天的交易平均数
2009-1-1 40 30 20
2010-1-1 40 30 20
2010-1-1 50 40 40 展开
有一个bill表 bill有字段 saledate(交易日期) 、 totalmoney(交易总金额)
求如何根据时间分组,并且求出当天的交易平均数、昨天的交易平均数 、去年当天的交易平均数 要求时间格式为(yyyy-MM-dd)
查询格式如下
时间 今天平均交易金额 昨天的交易平均数 去年当天的交易平均数
2009-1-1 40 30 20
2010-1-1 40 30 20
2010-1-1 50 40 40 展开
展开全部
oracle
selelect saledate ,sum('今天平均交易金额' ),
sum('昨天的交易平均数' ),
sum('去年当天的交易平均数' )
from (
select saledate '时间',
case when flag='1' then totalmoney/c else 0 end '今天平均交易金额' ,
case when flag='2' then totalmoney/c else 0 end '昨天的交易平均数' ,
case when flag='3' then totalmoney/c else 0 end '去年当天的交易平均数'
from (
select '1' flag,saledate,count(交易数)c,sum(totalmoney)totalmoney from bill where saledate=当天日期--to_char(sysdate,'yyyy-mm-dd')
union
select '2'flag,saledate,count(交易数),sum(totalmoney) from bill where saledate=昨天日期--to_char(sysdate-1,'yyyy-mm-dd')
union
select '3'flag,saledate,count(交易数),sum(totalmoney) from bill where saledate=去年当天日期--to_char((SYSDATE -INTERVAL '1'),'yyyy-mm-dd')
) temp group by saledate
)temp group by saledate;
selelect saledate ,sum('今天平均交易金额' ),
sum('昨天的交易平均数' ),
sum('去年当天的交易平均数' )
from (
select saledate '时间',
case when flag='1' then totalmoney/c else 0 end '今天平均交易金额' ,
case when flag='2' then totalmoney/c else 0 end '昨天的交易平均数' ,
case when flag='3' then totalmoney/c else 0 end '去年当天的交易平均数'
from (
select '1' flag,saledate,count(交易数)c,sum(totalmoney)totalmoney from bill where saledate=当天日期--to_char(sysdate,'yyyy-mm-dd')
union
select '2'flag,saledate,count(交易数),sum(totalmoney) from bill where saledate=昨天日期--to_char(sysdate-1,'yyyy-mm-dd')
union
select '3'flag,saledate,count(交易数),sum(totalmoney) from bill where saledate=去年当天日期--to_char((SYSDATE -INTERVAL '1'),'yyyy-mm-dd')
) temp group by saledate
)temp group by saledate;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-02-27
展开全部
-- 测试数据.
CREATE TABLE bill (
saledate DATE,
totalmoney INT
);
INSERT INTO bill VALUES( sysdate, 30);
INSERT INTO bill VALUES( sysdate, 50);
INSERT INTO bill VALUES( sysdate - 1, 40);
INSERT INTO bill VALUES( sysdate - 1, 60);
INSERT INTO bill VALUES( ADD_MONTHS(sysdate, -12), 20);
INSERT INTO bill VALUES( ADD_MONTHS(sysdate, -12), 30);
-- 查询 SQL。
With cte AS (
SELECT
trunc(saledate) AS saledate,
AVG(totalmoney) AS avgmoney
FROM
bill
GROUP BY
trunc(saledate)
)
SELECT
*
FROM cte
MODEL
DIMENSION BY (saledate)
MEASURES(avgmoney, 0 AS PrevDay_avgmoney, 0 AS PrevYear_avgmoney)
(
PrevDay_avgmoney[ANY] = avgmoney[CV(saledate) - 1],
PrevYear_avgmoney[ANY] = avgmoney[ ADD_MONTHS( CV(saledate), -12) ]
)
ORDER BY
saledate;
-- 查询结果:
SALEDATE AVGMONEY PREVDAY_AVGMONEY PREVYEAR_AVGMONEY
---------- ---------- ---------------- -----------------
27-2月 -12 25
26-2月 -13 50
27-2月 -13 40 50 25
SQL>
CREATE TABLE bill (
saledate DATE,
totalmoney INT
);
INSERT INTO bill VALUES( sysdate, 30);
INSERT INTO bill VALUES( sysdate, 50);
INSERT INTO bill VALUES( sysdate - 1, 40);
INSERT INTO bill VALUES( sysdate - 1, 60);
INSERT INTO bill VALUES( ADD_MONTHS(sysdate, -12), 20);
INSERT INTO bill VALUES( ADD_MONTHS(sysdate, -12), 30);
-- 查询 SQL。
With cte AS (
SELECT
trunc(saledate) AS saledate,
AVG(totalmoney) AS avgmoney
FROM
bill
GROUP BY
trunc(saledate)
)
SELECT
*
FROM cte
MODEL
DIMENSION BY (saledate)
MEASURES(avgmoney, 0 AS PrevDay_avgmoney, 0 AS PrevYear_avgmoney)
(
PrevDay_avgmoney[ANY] = avgmoney[CV(saledate) - 1],
PrevYear_avgmoney[ANY] = avgmoney[ ADD_MONTHS( CV(saledate), -12) ]
)
ORDER BY
saledate;
-- 查询结果:
SALEDATE AVGMONEY PREVDAY_AVGMONEY PREVYEAR_AVGMONEY
---------- ---------- ---------------- -----------------
27-2月 -12 25
26-2月 -13 50
27-2月 -13 40 50 25
SQL>
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询