統計出庫數,sql查詢數據,sqldf做透視表,循壞處理數據

#設置工作路徑 D:\資料\天富盈\天富盈\erp\erp錄入
setwd("D:\\資料\\程序文檔")

#設置文件名
path="C:\\Users\\Jarvis\\Desktop\\12月平臺品類數據.xlsx"

sql_yuju<-"SELECT * FROM edb_order
            WHERE SUBSTRING(`訂貨日期`,1,10) >= '2019-12-01'
            AND SUBSTRING(`訂貨日期`,1,10) <= '2019-12-31'"

#導入包
library(openxlsx)
library(dplyr)
library(sqldf) 
#library(RMySQL)

#鏈接數據庫
con<-RMySQL::dbConnect(RMySQL::MySQL(),host='127.0.0.1',port=3306,dbname="team fortune",user="root",password="123456")
#查看數據庫裏所有的表
dbListTables(con)
#設置編碼  GBK
dbSendQuery(con,'SET NAMES GBK') 
#查詢數據
E<-dbGetQuery(con,sql_yuju)

str(E)
#E店寶數據
#E<-read.csv('12月.csv',header=TRUE,sep=',',colClasses="character")

#店鋪名稱對照表連入D:\資料\天富盈\天富盈
duizhao<-read.xlsx('D:\\資料\\天富盈\\天富盈\\對照表.xlsx',1)

E<-left_join(E,duizhao,by="產品名稱")
names(E)
unique(E$店鋪名稱)

#按店鋪篩選
TM_E<-E[which(E$店鋪名稱=="【天】chocky旗艦店"),]
TB_E<-E[which(E$店鋪名稱=="【淘】泰好吃食趣"),]
JD_POP_E<-E[which(E$店鋪名稱=="【京】比斯奇果屋巧客旗艦店"),]
JD_ZHUAN_E<-E[which(E$店鋪名稱=="【京】天富盈食品專營店"),]
PDD_E<-E[which(E$店鋪名稱=="【拼】比斯奇果屋巧客食品旗艦店"),]
WPH_E<-E[which(E$店鋪名稱=="【唯】唯品會"),]
YZ_E<-E[which(E$店鋪名稱=="【贊】泰國比斯奇果屋巧客"),]
XHY_E<-E[which(E$店鋪名稱=="【黑】小黑魚APP"),]
XCX_E<-E[which(E$店鋪名稱=="小程序"),]
HSQ_E<-E[which(E$店鋪名稱=="好食期"),]
shopname<-c(substitute(TM_E),substitute(TB_E),
            substitute(JD_POP_E),substitute(JD_ZHUAN_E),
            substitute(PDD_E),substitute(WPH_E),
            substitute(YZ_E),substitute(XHY_E),
            substitute(XCX_E),substitute(HSQ_E))

#銷售量彙總
##分類彙總
toushi<-function(tablename){
  #做數據透視表,構建sql語句
  sql<-paste('select "產品名稱",sum(訂貨數量),sum("實付金額"),"修改後名稱" from ',tablename,' group by "產品名稱"',sep=" ")
  shops<-sqldf(sql)
  names(shops)<-c("產品名稱","訂貨數量","實付金額","修改後名稱")
  return(shops)
}

##數據處理   將分類名中有X的乘入  +號分開
clean<-function(tablname){
  #提取修改名後有X的名稱
  doubles<-grep(pattern = "X",x = tablname$修改後名稱,value = F)
  #提取乘以倍數
  LastBate<-as.integer(substr(tablname[doubles,]$修改後名稱,nchar(tablname[doubles,]$修改後名稱),nchar(shop[doubles,]$修改後名稱)))
  #將訂貨數量乘以倍數,去掉修改名稱後面的乘項
  tablname[doubles,]$訂貨數量 <- tablname[doubles,]$訂貨數量 *  LastBate 
  tablname[doubles,]$修改後名稱<-substr(tablname[doubles,]$修改後名稱,1,nchar(tablname[doubles,]$修改後名稱)-2)
  
  #提取修改名中有 + 的名稱
  adds<-grep(pattern = "\\+",x = tablname$修改後名稱,value = F)
  if (length(adds)!=0) {
    #將有+的數據剔除,複製到新表
    tichu<-tablname[adds,]
    tablname<-tablname[-adds,]
    
    #將修改名中有 + 的名稱用+切割爲list
    xx<-strsplit(tichu$修改後名稱,split = "\\+")
    
    #將有+的數據循環寫回原來的表
    for (j in c(1:length(adds))) {
      print("開始處理這個表")
      pro<-cbind(tichu$產品名稱[j],tichu$訂貨數量[j],tichu$實付金額[j]/length(xx[[j]]),xx[[j]])
      #print(pro)
      colnames(pro)<-colnames(tablname)
      tablname<-rbind(tablname,pro)
    }
    
  }else {
    print("這個表無需處理")
  } 
  return(tablname)
}

#循環查詢 
mydata<-list() 
for (i in shopname) {
  shop<-toushi(i)
  shop<-clean(shop)
  #再進行一次透視處理
  sql<-paste('select "修改後名稱",sum(訂貨數量),sum("實付金額") from ',substitute(shop),' group by "修改後名稱"',sep=" ")
  shops<-sqldf(sql)
  names(shops)<-c("產品名稱","訂貨數量","銷售額")
  shops<-arrange(shops, desc(shops$訂貨數量))
  mydata[[i]]<-shops
}

# 總體數據
shuju<-matrix(NA,0,3)
colnames(shuju)<-names(mydata[[1]])
shuju<-as.data.frame(shuju)
for (j in mydata){
  shuju<-rbind(shuju,j)
}
shuju<-sqldf('select "產品名稱",sum(訂貨數量) "訂貨數量",sum("銷售額") "銷售額" from shuju group by "產品名稱" order by 訂貨數量 DESC')

#寫出list
names(mydata)<-c("天貓", "淘寶","京東旗艦店" ,"京東專營店","拼多多",
                 "唯品會" ,"有贊" ,"小黑魚","小程序","好食期")
shuju<-list(shuju)
#寫出 
write.xlsx(c("總體"=shuju,mydata), path)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章