Dzisiaj pokażę jak zrobić w naszym programie funkcję trendu liniowego. Funkcja liniowa przydaje się do wizualnego reprezentowania trendu panującego w naszych zmiennych. Jeśli mamy wiele zmiennych i nie wiemy czy tendencja zmiennych jest spadkowa czy zwyżkowa nasz wykres nam to zilustruje i sami będziemy mogli to ocenić. Na obrazku zamieściłem wizualizacje takiego trendu w excelu:
Coś o tym trendzie można poczytać tutaj: Trend liniowy [5 stron]
Wersja excelowa: trend_liniowy
Warto zanim zaczniemy budować sql’a spróbować zrobić sobie taki trend w excelu aby sprawdzić czy wszystko rozumiemy. Tak prosto nie będzie, gdyż nie możemy dodać lokalnej bazy danych w programie visual studio 2012. Baza ta jest typu *.sdf i nie obsługuje „subselect’ów”.Potrzebujemy albo bazy typu *.mdf (baza serwera SQL) albo bazy danych typu *.mdb (baza programu access). Ja użyje bazy danych typu *.mdb. Stworze ją w programie „MDB Plus” dostępnego w dziale „Przydatne programy do vb.net”. Moja baza danych wygląda tak:
Jeśli ktoś nie wie jak utworzyć bazę danych w programie MDBPlus to zapraszam do działu technicznego. Teraz tak na prawdę musimy wzór na funkcje liniową trochę przekształcić. Najważniejszym elementem jest „a” więc najpierw przekształcimy sobie właśnie to „a”.
W SQL’u będzie to wyglądało tak:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
select id,t, ilosci, ((select sum(t*ilosci) as Expr1 from trend_liniowy as trend_liniowy_1) - (select avg(t) as Expr1 from trend_liniowy as trend_liniowy_2) * (Select sum(ilosci) as Expr1 from trend_liniowy as trend_liniowy_3)) / ((select sum(t^2) as Expr1 from trend_liniowy as trend_liniowy_4) - 2*(select avg(t) as Expr1 from trend_liniowy as trend_liniowy_5) * (select sum(t) as Expr1 from trend_liniowy as trend_liniowy_6) + (select max(t) as Expr1 from trend_liniowy as trend_liniowy_7) * (select avg(t)^2 as Expr1 from trend_liniowy as trend_liniowy_8)) as tre from trend_liniowy group by id,t,ilosci |
Po wykonaniu zapytania otrzymamy:
Jeśli widzieliście plik excel to tam też a wyszło równe 5,16 teraz już tylko formalność
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
select id,t, ilosci, (select avg(ilosci) as Expr1 from trend_liniowy as trend_liniowy_0) - ((select sum(t*ilosci) as Expr1 from trend_liniowy as trend_liniowy_1) - (select avg(t) as Expr1 from trend_liniowy as trend_liniowy_2) * (Select sum(ilosci) as Expr1 from trend_liniowy as trend_liniowy_3)) / ((select sum(t^2) as Expr1 from trend_liniowy as trend_liniowy_4) - 2*(select avg(t) as Expr1 from trend_liniowy as trend_liniowy_5) * (select sum(t) as Expr1 from trend_liniowy as trend_liniowy_6) + (select max(t) as Expr1 from trend_liniowy as trend_liniowy_7) * (select avg(t)^2 as Expr1 from trend_liniowy as trend_liniowy_8)) * (select avg(t) as Expr1 from trend_liniowy as trend_liniowy_9) as tre from trend_liniowy group by id,t,ilosci |
Tak i tutaj wyszło b=9,54
teraz wystarczy tylko to połączyć i otrzymujemy trend liniowy :]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
select id,t, ilosci, ((select sum(t*ilosci) as Expr1 from trend_liniowy as trend_liniowy_1) - (select avg(t) as Expr1 from trend_liniowy as trend_liniowy_2) * (Select sum(ilosci) as Expr1 from trend_liniowy as trend_liniowy_3)) / ((select sum(t^2) as Expr1 from trend_liniowy as trend_liniowy_4) - 2*(select avg(t) as Expr1 from trend_liniowy as trend_liniowy_5) * (select sum(t) as Expr1 from trend_liniowy as trend_liniowy_6) + (select max(t) as Expr1 from trend_liniowy as trend_liniowy_7) * (select avg(t)^2 as Expr1 from trend_liniowy as trend_liniowy_8)) *t+ (select avg(ilosci) as Expr1 from trend_liniowy as trend_liniowy_0) - ((select sum(t*ilosci) as Expr1 from trend_liniowy as trend_liniowy_1) - (select avg(t) as Expr1 from trend_liniowy as trend_liniowy_2) * (Select sum(ilosci) as Expr1 from trend_liniowy as trend_liniowy_3)) / ((select sum(t^2) as Expr1 from trend_liniowy as trend_liniowy_4) - 2*(select avg(t) as Expr1 from trend_liniowy as trend_liniowy_5) * (select sum(t) as Expr1 from trend_liniowy as trend_liniowy_6) + (select max(t) as Expr1 from trend_liniowy as trend_liniowy_7) * (select avg(t)^2 as Expr1 from trend_liniowy as trend_liniowy_8)) * (select avg(t) as Expr1 from trend_liniowy as trend_liniowy_9) as tre from trend_liniowy group by id,t,ilosci |
Dla porównania Dane z Excela i dane z MdbPlus. Więc Querry mamy z głowy teraz dla tych którzy nie wiedzą jak wykorzystać to w praktyce zrobimy sobie program, podczepimy bazę damych *.mdb i wyświetlimy te dane w oknie wykresu.
Teraz tworzymy nowy projekt i będziemy montować naszą bazę danych. Gdy przygotujemy już pusty projekt, kopiujemy naszą bazę danych do folderu projektu dokładnie tutaj:
Wracamy do naszego projektu. Musimy dodać moduł robimy to tak:
A po dodaniu po prawej stronie powinien pojawić nam się nowy element modułu:
Teraz tworzymy publiczne połączenie do naszej bazy danych. Wygląda ono tak:
1 2 3 4 5 |
Imports System.Data Imports System.Data.Odbc Module Module1 Public con As New OdbcConnection("Driver={Microsoft Access Driver (*.mdb)};DBQ=|DataDirectory|\trend_liniowy.mdb;") End Module |
Gdzie w DBQ wpisujemy lokalizacje naszej bazy danych i jej nazwę. |DataDirectory| oznacza, że plik znajduje się w folderze z aplikacją. Przechodzimy do naszej formy głównej i tworzymy połączenie:
1 2 3 4 5 |
Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Con.open() End Sub End Class |
Odpalamy nasz program. Jeśli wszystko jest dobrze powinna pojawić nam się czysta forma. Jeśli wystąpi błąd należy sprawdzić parametry połączenia. Teraz dodajemy do naszej formy wykres („Chart”). Znajdziemy go w „Przyborniku”, przenosimy na naszą formę.
Po prawej stronie znajdujemy we właściwościach naszego wykresu opcje „Series”.
Dodajemy jeszcze jedną serie danych:
zmieniamy jej typ na „line” jeśli pierwsza seria jest typu „column” warto jej również zmienić typ na „line”. Warto tutaj poeksperymentować z „Seies”, „Legends” i „ChartAreas” aby nasz wykres nabrał trochę zarówno czytelności jak i wyglądu. Po kilku zmianach mój wykres wygląda tak:
Wracamy do naszego kodu i wypełniamy nasz wykres danymi z tabeli. Kod do tego służący wygląda tak:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
Imports System.Data.Odbc Imports System.Windows.Forms.DataVisualization.Charting Public Class Form1 Dim cmd As New OdbcCommand Dim dat As OdbcDataReader Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load con.Open() Dim querry As String querry = "select id,t, ilosci, round(((select sum(t*ilosci) as Expr1 from trend_liniowy as trend_liniowy_1)-(select avg(t) as Expr1 from trend_liniowy as trend_liniowy_2)*(Select sum(ilosci) as Expr1 from trend_liniowy as trend_liniowy_3))/((select sum(t^2) as Expr1 from trend_liniowy as trend_liniowy_4)-2*(select avg(t) as Expr1 from trend_liniowy as trend_liniowy_5)*(select sum(t) as Expr1 from trend_liniowy as trend_liniowy_6)+(select max(t) as Expr1 from trend_liniowy as trend_liniowy_7)*(select avg(t)^2 as Expr1 from trend_liniowy as trend_liniowy_8))*t+(select avg(ilosci) as Expr1 from trend_liniowy as trend_liniowy_0)-((select sum(t*ilosci) as Expr1 from trend_liniowy as trend_liniowy_1)-(select avg(t) as Expr1 from trend_liniowy as trend_liniowy_2)*(Select sum(ilosci) as Expr1 from trend_liniowy as trend_liniowy_3))/((select sum(t^2) as Expr1 from trend_liniowy as trend_liniowy_4)-2*(select avg(t) as Expr1 from trend_liniowy as trend_liniowy_5)*(select sum(t) as Expr1 from trend_liniowy as trend_liniowy_6)+(select max(t) as Expr1 from trend_liniowy as trend_liniowy_7)*(select avg(t)^2 as Expr1 from trend_liniowy as trend_liniowy_8))*(select avg(t) as Expr1 from trend_liniowy as trend_liniowy_9),2) as tre from trend_liniowy group by id,t,ilosci" Try cmd = New OdbcCommand(querry, con) dat = cmd.ExecuteReader Dim ds As New DataSet Dim oData As New OdbcDataAdapter(querry, con) oData.Fill(ds, "Table1") Chart1.DataSource = ds.Tables("Table1") Dim Series1 As Series = Chart1.Series("Series1") Dim Series2 As Series = Chart1.Series("Series2") Series1.Name = "Sprzedaż" Chart1.Series(Series1.Name).XValueMember = "t" Chart1.Series(Series1.Name).YValueMembers = "ilosci" Series2.Name = "Trend liniowy" Chart1.Series(Series2.Name).XValueMember = "t" Chart1.Series(Series2.Name).YValueMembers = "tre" Catch ex As Exception MsgBox(ex.Message) Finally cmd.Dispose() con.Close() End Try End Sub End Class |
To by było na tyle. Jeśli ktoś ma jakieś pytania proszę je zostawić w komentarzach albo pisać na maila.
cały program do pobrania: trend_liniowy