From 5092c10859e4e7dfa4c10d58a8ea0df939e23c3a Mon Sep 17 00:00:00 2001 From: RobViren Date: Thu, 21 Oct 2021 09:48:17 -0500 Subject: [PATCH] Seperate Files --- CFY.sql | 30 ++++++++++++-- main.go | 98 ++++------------------------------------------ process_excel.go | 100 +++++++++++++++++++++++++++++++++++++++++++++++ top.sql | 5 +-- 4 files changed, 136 insertions(+), 97 deletions(-) create mode 100644 process_excel.go diff --git a/CFY.sql b/CFY.sql index e24f140..dbf7439 100644 --- a/CFY.sql +++ b/CFY.sql @@ -1,3 +1,27 @@ --- SQLite -SELECT SUM(quantity) AS qty, SUM(revenue) AS rev -FROM data WHERE description LIKE "%RoboSHOT 30E USB%" AND date >= '2021-01-01'; \ No newline at end of file +WITH const as (select "%ROBOSHOT%" as target) +SELECT + description, + -- year, + -- month, + sum(revenue), + sum(quantity) +from + data +where + description like const.target + and year = 2021 + and month BETWEEN 7 + and 9 +group by + description; +select + description, + sum(revenue), + sum(quantity) +from + data +where + description like const.target + and year = 2021 + and month BETWEEN 7 + and 9; \ No newline at end of file diff --git a/main.go b/main.go index c5bb78e..0c357e9 100644 --- a/main.go +++ b/main.go @@ -1,44 +1,10 @@ package main import ( - "fmt" + "flag" "log" - "strconv" - "strings" - "time" - - "database/sql" - - _ "github.com/mattn/go-sqlite3" - "github.com/xuri/excelize/v2" ) -var schema = ` -CREATE TABLE IF NOT EXISTS data ( - description text, - sku text, - level2 text, - level3 text, - revenue float, - cost float, - quantity integer, - year integer, - month integer -); -` - -type Data struct { - Description string - SKU string - Level2 string - Level3 string - Revenue float64 - Cost float64 - Quantity int64 - Year int64 - Month int64 -} - func checkErr(err error) { if err != nil { log.Fatal(err) @@ -46,62 +12,14 @@ func checkErr(err error) { } func main() { - fmt.Println("Processing excel file...") - start := time.Now() + var ( + excel_file string + ) - f, err := excelize.OpenFile("data.xlsx") - checkErr(err) + flag.StringVar(&excel_file, "file", "", "The path to the excel file for processing") + flag.Parse() - rows, err := f.GetRows("Sheet1") - checkErr(err) - - const offset = 3 - data := []Data{} - for i, row := range rows { - if i >= offset { - new_data := Data{SKU: row[33], Level2: row[29], Level3: row[30], Description: row[44]} - - //Parse Rev - rev, err := strconv.ParseFloat(row[72], 64) - checkErr(err) - new_data.Revenue = rev - - //Parse Cost - cost, err := strconv.ParseFloat(row[16], 64) - checkErr(err) - new_data.Cost = cost - - //Parse Quantity - qty, err := strconv.ParseInt(row[71], 10, 64) - checkErr(err) - new_data.Quantity = qty - - //Parse Time - day, err := time.Parse("2006-01", row[26]) - checkErr(err) - new_data.Year = int64(day.Year()) - new_data.Month = int64(day.Month()) - - data = append(data, new_data) - } + if excel_file != "" { + ProcessExcel(excel_file) } - - db, err := sql.Open("sqlite3", "data.db") - checkErr(err) - defer db.Close() - - db.Exec("DROP TABLE IF EXISTS data") - db.Exec(schema) - - values := []string{} - for _, elm := range data { - values = append(values, fmt.Sprintf(`("%s","%s","%s","%s",%f,%f,%d,"%d","%d")`, strings.ReplaceAll(elm.Description, "\"", ""), elm.SKU, elm.Level2, elm.Level3, elm.Revenue, elm.Cost, elm.Quantity, elm.Year, elm.Month)) - } - - stmt := "INSERT INTO data (description,sku,level2,level3,revenue,cost,quantity,year,month) VALUES " + strings.Join(values, ",") - _, err = db.Exec(stmt) - checkErr(err) - - elapsed := time.Since(start) - fmt.Printf("Operation complete in %s\n", elapsed) } diff --git a/process_excel.go b/process_excel.go new file mode 100644 index 0000000..04d1371 --- /dev/null +++ b/process_excel.go @@ -0,0 +1,100 @@ +package main + +import ( + "fmt" + "strconv" + "strings" + "time" + + "database/sql" + + _ "github.com/mattn/go-sqlite3" + "github.com/xuri/excelize/v2" +) + +var schema = ` +CREATE TABLE IF NOT EXISTS data ( + description text, + sku text, + level2 text, + level3 text, + revenue float, + cost float, + quantity integer, + year integer, + month integer +); +` + +type Data struct { + Description string + SKU string + Level2 string + Level3 string + Revenue float64 + Cost float64 + Quantity int64 + Year int64 + Month int64 +} + +func ProcessExcel(path string) { + fmt.Println("Processing excel file...") + start := time.Now() + + f, err := excelize.OpenFile(path) + checkErr(err) + + rows, err := f.GetRows("Sheet1") + checkErr(err) + + const offset = 3 + data := []Data{} + for i, row := range rows { + if i >= offset { + new_data := Data{SKU: row[33], Level2: row[29], Level3: row[30], Description: row[44]} + + //Parse Rev + rev, err := strconv.ParseFloat(row[72], 64) + checkErr(err) + new_data.Revenue = rev + + //Parse Cost + cost, err := strconv.ParseFloat(row[16], 64) + checkErr(err) + new_data.Cost = cost + + //Parse Quantity + qty, err := strconv.ParseInt(row[71], 10, 64) + checkErr(err) + new_data.Quantity = qty + + //Parse Time + day, err := time.Parse("2006-01", row[26]) + checkErr(err) + new_data.Year = int64(day.Year()) + new_data.Month = int64(day.Month()) + + data = append(data, new_data) + } + } + + db, err := sql.Open("sqlite3", "data.db") + checkErr(err) + defer db.Close() + + db.Exec("DROP TABLE IF EXISTS data") + db.Exec(schema) + + values := []string{} + for _, elm := range data { + values = append(values, fmt.Sprintf(`("%s","%s","%s","%s",%f,%f,%d,"%d","%d")`, strings.ReplaceAll(elm.Description, "\"", ""), elm.SKU, elm.Level2, elm.Level3, elm.Revenue, elm.Cost, elm.Quantity, elm.Year, elm.Month)) + } + + stmt := "INSERT INTO data (description,sku,level2,level3,revenue,cost,quantity,year,month) VALUES " + strings.Join(values, ",") + _, err = db.Exec(stmt) + checkErr(err) + + elapsed := time.Since(start) + fmt.Printf("Operation complete in %s\n", elapsed) +} diff --git a/top.sql b/top.sql index d9d8636..cba36ad 100644 --- a/top.sql +++ b/top.sql @@ -12,16 +12,13 @@ SELECT from ( SELECT + *, ROW_NUMBER () OVER ( PARTITION BY level2 ORDER BY SUM(revenue) DESC ) rownum, SUM(revenue) OVER (PARTITION BY level2) total, - description, - sku, - level2, - level3, ROUND(SUM(revenue), 2) as rev, SUM(quantity) as qty, trend