1. 程式人生 > >SQL 求同比 環比

SQL 求同比 環比

一、要求
1、表結構如下:
ID  DepartName(部門) Sales(銷售量) SalesDate(銷售日期)
1      營銷一部       300              2006-7-1 
2      營銷二部       500              2006-7-1 
3      營銷三部       800              2006-8-1 
4      營銷一部       600              2006-8-1 
5      營銷二部       800              2006-8-1 
6      營銷一部       400              2007-7-1 
7      營銷二部       800              2007-7-1 

8      營銷三部       700              2007-8-1 
9      營銷一部       600              2008-7-1 
10     營銷二部       300              2008-7-1 
2、要根據要求得到以下資料
1)得到同比資料
部門  對比年月 本月銷售總量  去年同期銷售總量 同比
營銷一部 2006-07-01 300.00  NULL  無窮大
營銷二部 2006-07-01 500.00  NULL  無窮大
營銷三部 2006-08-01 800.00  NULL  無窮大
營銷一部 2006-08-01 600.00  NULL  無窮大
營銷二部 2006-08-01 800.00  NULL  無窮大
營銷一部 2007-07-01 400.00  300.00  33.33%

營銷二部 2007-07-01 800.00  500.00  60.00%
營銷三部 2007-08-01 700.00  800.00  -12.50%
營銷一部 2008-07-01 600.00  400.00  50.00%
營銷二部 2008-07-01 700.00  800.00  -12.50%
(2)選擇月份 獲取環比資料
部門  對比年月 本月銷售總量  上月銷售總量 環比
營銷一部 2006-07-01 300.00  NULL  無窮大
營銷二部 2006-07-01 500.00  NULL  無窮大
營銷三部 2006-08-01 800.00  NULL  無窮大
營銷一部 2006-08-01 600.00  300.00  100.00%
營銷二部 2006-08-01 800.00  500.00  60.00%
營銷一部 2007-07-01 400.00  NULL  無窮大
營銷二部 2007-07-01 800.00  NULL  無窮大

營銷三部 2007-08-01 700.00  NULL  無窮大
營銷一部 2008-07-01 600.00  NULL  無窮大
營銷二部 2008-07-01 700.00  NULL  無窮大

二、程式碼:
1、建立表
CREATE TABLE SalesDetail(
ID int,   --序號
DepartName varchar(50), --部門
Sales decimal(10,2), --銷售量
SalesDate Datetime --銷售日期
)
2、插入測試資料
insert into SalesDetail(ID, DepartName, Sales, SalesDate)
select 1, '營銷一部', 300, '2006-7-1'
UNION ALL select 2, '營銷二部', 500, '2006-7-1'
UNION ALL select 3, '營銷三部', 800, '2006-8-1'
UNION ALL select 4, '營銷一部', 600, '2006-8-1'
UNION ALL select 5, '營銷二部', 800, '2006-8-1'
UNION ALL select 6, '營銷一部', 400, '2007-7-1'
UNION ALL select 7, '營銷二部', 800, '2007-7-1'
UNION ALL select 8, '營銷三部', 700, '2007-8-1'
UNION ALL select 9, '營銷一部', 600, '2008-7-1'
UNION ALL select 10, '營銷二部', 700, '2008-7-1'
3、實現SQL程式碼
//得到環比
select c.DepartName as 部門, convert(varchar(10), c.SalesDate, 23) as 對比年月, c.Sales as 本月銷售總量, d.Sales as 上月銷售總量, case when d.Sales is null or d.Sales=0 then '無窮大' else cast(cast((isnull(c.Sales, 0)-isnull(d.Sales,0))*100/isnull(d.Sales, 0) as decimal(10,2)) as varchar(50))+'%' end as 環比 from SalesDetail c left join
(select a.DepartName as DepartName, a.Sales as Sales, a.SalesDate as lsSalesDate, b.SalesDate as SalesDate from SalesDetail a join SalesDetail b on a.SalesDate=DateAdd(month, -1, b.SalesDate) and a.DepartName=b.DepartName) d
on c.SalesDate=d.SalesDate and c.DepartName=d.DepartName
//得到同比
select c.DepartName as 部門, convert(varchar(10), c.SalesDate, 23) as 對比年月, c.Sales as 本月銷售總量, d.Sales as 去年同期銷售總量, case when d.Sales is null or d.Sales=0 then '無窮大' else cast(cast((isnull(c.Sales, 0)-isnull(d.Sales,0))*100/isnull(d.Sales, 0) as decimal(10,2)) as varchar(50))+'%' end as 同比 from SalesDetail c left join
(select a.DepartName as DepartName, a.Sales as Sales, a.SalesDate as lsSalesDate, b.SalesDate as SalesDate from SalesDetail a join SalesDetail b on a.SalesDate=DateAdd(year, -1, b.SalesDate) and a.DepartName=b.DepartName) d
on c.SalesDate=d.SalesDate and c.DepartName=d.DepartName
4、SQL語句說明
//獲取根據時間獲取去年同期時間
select DateAdd(year, -1, SalesDate)
//獲取根據時間獲取上月時間
select DateAdd(month, -1, SalesDate)
//獲取根據時間獲取去年同期時間資料
select a.DepartName as DepartName, a.Sales as Sales, a.SalesDate as lsSalesDate, b.SalesDate as SalesDate from SalesDetail a join SalesDetail b on a.SalesDate=DateAdd(year, -1, b.SalesDate) and a.DepartName=b.DepartName
//獲取根據時間獲取上月時間資料
select a.DepartName as DepartName, a.Sales as Sales, a.SalesDate as lsSalesDate, b.SalesDate as SalesDate from SalesDetail a join SalesDetail b on a.SalesDate=DateAdd(month, -1, b.SalesDate) and a.DepartName=b.DepartName

相關推薦

SQL 求同

一、要求1、表結構如下:ID  DepartName(部門) Sales(銷售量) SalesDate(銷售日期)1      營銷一部       300              2006-7-1 2      營銷二部       500              2

在論壇中出現的比較難的sql問題:31(row_number函式+子查詢 月計算)

最近,在論壇中,遇到了不少比較難的sql問題,雖然自己都能解決,但發現過幾天后,就記不起來了,也忘記解決的方法了。 所以,覺得有必要記錄下來,這樣以後再次碰到這類問題,也能從中獲取解答的思路。

mysql 循對數據

mysql 循環比對數據#!/bin/bashdir_1="/tmp/check/177/*"log_dir="/tmp/check/"mysql_1="mysql - -p-h -P3336"db_1=`ls -1 $dir_1`for db_1 in $db_1;do echo "正在執行檢查"${

凈利潤滾動增長率

href 例如 dao tar ref get targe 去年 AR 滾動一般是指過去1年為周期來對比。例如今年第一季度凈利潤滾動環比增長率=((今年第一季度凈利率+去年第四季度凈利率+去年第三季度凈利率+去年第二季度凈利率)-(去年第四季度凈利率+去年第三季度凈利率+去

dax-自定義周做同比和

都沒有 切分 filter 圖片 text col 哈哈 銷售 calculate 中國式報表:公司要指定財務月做月度周期,然後還要切分周,要做同比和環比。查了一些老師的文章和資料,發覺都沒有現在要求的這麽復雜。於是只好用很笨的辦法去寫了公式,至少看起來是需求的樣子了,後續

統計--------同比、、PV、UV、VV、IP

同比、環比 同比增長率=(本期數-同期數)÷同期數×100% 環比增長速度=(本期數-上期數)÷上期數×100% 同比發展速度,一般指是指本期發展水平與上年同期發展水平對比,而達到的相對發展速度。 環比發展速度,一般是指報告期水平與前一時期水平之比,表明現象逐期的發展速度。 PV、U

派派月度增長明顯 創新互動玩法引關注

進入下半年,全網各領域廠商們又開始新一輪出擊。不同的平臺玩法也不盡相同,在產品優化、使用者運營、內容運營上都各顯其招,企圖通過多種玩法吸引使用者並加強互動,獲得使用者資料的顯著增長。在數以千計的APP中哪些平臺的招數更為有效,最新出爐的Analysys易觀“2018年9月移動App TOP1000”排行榜或許

派派月度增長明顯 創新互動玩法引關註

不可 很多 調查 廠商 聊天功能 手遊 優化 時間 不同 進入下半年,全網各領域廠商們又開始新一輪出擊。不同的平臺玩法也不盡相同,在產品優化、用戶運營、內容運營上都各顯其招,企圖通過多種玩法吸引用戶並加強互動,獲得用戶數據的顯著增長。在數以千計的APP中哪些平臺的招數更為有

【鏈塔DApp週報】BDI指數上漲52%,以太坊DApp交易額增長38%

時間:11月26日 根據鏈塔DApp資料分析,11月19日至25日,鏈塔DApp行業指數BDI以225點結束,環比上漲51.51%。 以太坊DApp總數為1166個,環比增加17個;一週交易額為8.09萬ETH,環比增長38.05%;一週累計總日活為5.83萬人,環比下降0.85%。 EOS DAp

增長或下降的百分比計算以及同比概念

例子: 今年產量為a, 去年產量為b, 問 今年比去年增長(減少)了百分之幾? 答案: (今年 - 去年) / 去年, 為正是增長,為負是減少 進一步, 問現在比原來多(少)原來的百分之幾的做法:100%×(現在-原來)/原來 問現在

同比增長、增長是如何計算的?

1.同比增長   和上一時期、上一年度或歷史相比的增長(幅度)。   同比增長計算公式   同比增長率=(本期數-同期數)÷同期數   例子   比如說去年3月的產值100萬,今年3月的產值300萬,

psql計算和同比

\c dw; –連線到資料庫 drop table if exists stg.d_mars_rate_hb_1 ; create table if not exists stg.d_mars_rate_hb_1( category_1 TEXT,

R語言中同比增長和增長

      同比增長:與上個週期的同一天或者同一個季度,進行對比。       環比增長:與同個週期的不同天或者不同季度,進行對比。       比如,本週星期三與上週星期三進行比較,就是同比,                   本週星期三與本週星期二進行比較,就是環比。

用分析服務SSAS解決佔、同比和問題

本文將介紹用分析服務SSAS如何解決佔比、同比和環比三個指標。 首先理解一下這三個指標的基本概念: 佔比是指當前成員的值與該成員父級的值的比率,意思是在總數中所佔的比重,比如某水果商店總銷售額為14,其中蘋果的銷售額為2,佔比就是14.3%。 同比是指在一個期間內的值與以前

oracle求同比,函式 LAG和LEAD

CREATE TABLE salaryByMonth (  employeeNo varchar2(20),  yearMonth varchar2(6),  salary number ) ; insert into SALARYBYMONTH (EMPLOYEENO, YEARMONTH, SALAR

基於統計的預警:同預警實現深度剖析

一、UAV預警功能簡介 UAV.Monitor提供了對全維監控指標的預警功能,各型別的監控指標均可配置預警策略,當預警策略被觸發後,可通過郵件、HTTP呼叫等方式進行通知報警,並會根據預警時間頻率等對報警動作進行壓制。 預警分為流式預警、統計預警以及混合預警三種。 流式預警會對採集到的每一個監控指標資料進行

sql server 循插入列

sql server drop table #tempselect name,IDENTITY(int,1,1) as idinto #tempfrom syscolumnswhere id =(select id from sysobjects where xtype=‘u‘ and name =

Oracle筆記4-pl/sql-分支/循/遊標/異常/存儲/調用/觸發器

eal lar 數據交互 實現 after table while gin base 一.pl/sql(Procedure Language/SQL)編程語言 1.概念 PL/SQL是Oracle數據庫對SQL語句的擴展。在普通SQL語句的使用上增加了編程語言的特點,所以P

PL/SQL loop循詳解

重新 包含 proc out 語法 pre 操作 bool output 在PL/SQL中可以使用LOOP語句對數據進行循環處理,利用該語句可以循環執行指定的語句序列。常用的LOOP循環語句包含3種形式:基本的LOOP、WHILE...LOOP和FOR...LOOP。

SQL SERVER循遍歷(普通循和遊標循

into 變量 alloc lar -1 記錄 gin pda 普通 1、首先需要一個測試表數據Student 2、普通循環 1)循環5次來修改學生表信息 --循環遍歷修改記錄--declare @i int set @i=0while @i<5b