iT邦幫忙

0

PHP 撰寫報表方式

各位大大好
小弟最近在練習寫一些報表

內容是計算一段時間內所有超商內訂票系統中演唱會票和展覽票的銷售情況
資料來源是每一筆的交易明細
資料庫不小 大概有4000多個表
此報表只引用三個 門市 交易紀錄 訂票紀錄(還未付錢)
資料表內容也蠻多的 大概有600萬以上的資料

報表大概長這樣(簡化版):
區域 營業部 已付演唱會票數量 已付展覽票數量 未付演唱會票數量 未付展覽票數量
北區一部
北區 北區二部
北區三部
中區一部
中區 中區二部
中區三部
東區 東區一部
南區一部
南區 南區二部
  
我是已經完成了
不過我是用迴圈去跑所有的銷售狀況
流程大概是以下這樣:
先找出所有門市
在去針對每個門市 去搜尋它們在這段期間演唱會票和展覽會票的交易和訂票紀錄
所以會變成
while(門市):
select 演唱會票,展覽會票 from 銷售 where 門市
select 演唱會票,展覽會票 from 訂票 where 門市
也就是說 我是一列一列找資料並統整後印出來

而我的前輩有提供另外一種做法
是用陣列的方式去做的
流程就會變成這樣:
找出所有門市 => 放到以門市為索引的陣列中
找出演唱會票,展覽會票 from 銷售 => 比對門市索引放到陣列中
找出演唱會票,展覽會票 from 訂票 => 比對門市索引放到陣列中
最後再一個一個刻在表格中

最後結果
他幾乎開了網頁大概1-2秒就有資料
我的作法比他慢了大概8-10秒
這應該就是O(n^2)和O(n)的差距!?
只是他的code裡面有2-6維陣列的存在 還有陣列中的陣列
比較不直觀這樣

單純只是好奇
我明白我可能講的也沒有很清楚
我的問題其實就是下方敘述這樣
在不考慮動到DB的情況下
一般大大都會使用什麼樣的做法來寫報表
提供給小弟參考

看更多先前的討論...收起先前的討論...
dragonH iT邦超人 5 級 ‧ 2020-02-20 16:56:40 檢舉
呃 這不就是 index 的優點嗎XD
st474ddr iT邦新手 2 級 ‧ 2020-02-20 16:58:09 檢舉
@dragonH 大大
是指DB的index嗎
其實table都有建index了
dragonH iT邦超人 5 級 ‧ 2020-02-20 17:10:23 檢舉
喔~ 那就當我沒說
player iT邦大師 1 級 ‧ 2020-02-20 17:19:51 檢舉
你是在問SQL查大量資料? 不是在問PHP報表? (因為你也沒講你用哪種PHP套件去做報表)
st474ddr iT邦新手 2 級 ‧ 2020-02-20 17:35:37 檢舉
@player 大大
只用PHP + mysql 沒有用套件
我想問的其實是大大們平常都如何寫報表
只是前面舉了例子而已
因為目前見識短淺的我只有看過這兩種做法
player iT邦大師 1 級 ‧ 2020-02-20 17:49:40 檢舉
PHP能用的報表套件有很多種(請google找php+Reports)
先列出其中一個你參考看看
https://jdorn.github.io/php-reports/
這邊有教學
https://www.brilliantcode.net/550/php-reports-reporting-service-with-php/
st474ddr iT邦新手 2 級 ‧ 2020-02-20 18:03:42 檢舉
@player 大大
感謝您提供的資源
因為目前使用的主機環境沒有Composer 哈哈
我會在我自己上電腦玩玩看
player iT邦大師 1 級 ‧ 2020-02-20 18:03:56 檢舉
關於大量資料查詢要建立報表
記得最好是先做資料清理的動作
把你的報表會用的欄位都整理好, 扔到暫存資料表上
然後PHP的報表套件(不論哪一種)再去抓這個暫存資料表來用
player iT邦大師 1 級 ‧ 2020-02-20 18:12:00 檢舉
如果你有辦法取得Crystal Reports的話
(Crystal Reports是商用的報表軟體, 如果你有Visual Studio Pro版的話, 可以下載Crystal Reports for Visual Studio 版來用)
這裡有教怎麼用PHP與MySQL接上Crystal Reports
https://stackoverflow.com/questions/43889488/crystal-reports-11-5-with-php-and-mysql

不過WebServer應該得要Windows才能用 (記得Linux或FreeBSD應該沒辦法用ActiveX)
froce iT邦大師 1 級 ‧ 2020-02-20 19:44:03 檢舉
> 只是他的code裡面有2-6維陣列的存在 還有陣列中的陣列

這很常見啊,就類似json。
沒看到code,不過基本上要快就是盡量少做I/O,SQL寫好,然後用JSON/Protocol Buffers傳給前端。
st474ddr iT邦新手 2 級 ‧ 2020-02-21 09:20:31 檢舉
@player 大
> 然後PHP的報表套件(不論哪一種)再去抓這個暫存資料表來用

現在其實抓的就是暫存資料表了
只是可能DB有點雜XDD~
我了解資料清理的重要性 不過我沒權限去動QQ
  
> Crystal Reports
可惜我們的主機是CentOS的樣子
不過我可以去SAP網站下載試用看看
  
@froce 大大
> 這很常見啊,就類似json
原來如此 因為平常很少用陣列做這些
最多就開到三四維 就已經覺得多了哈哈
不過看到填格子要打好多 就覺得眼花
froce iT邦大師 1 級 ‧ 2020-02-21 11:29:40 檢舉
填格子都用迴圈填,照著json的結構根本打不了多少code吧...
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
ckp6250
iT邦好手 1 級 ‧ 2020-02-20 20:03:41

我直覺,效能差異在 sql 的撰寫上,
sql 寫得好,600 萬筆資料不算什麼。

至於報表方面,我個人是 100% 利用 phpexcel 來做,
會計小姐最愛了,因為它便於二次加工。

st474ddr iT邦新手 2 級 ‧ 2020-02-21 09:10:10 檢舉

效能差異在 sql 的撰寫上

可是我用phpmyadmin開這個資料庫都要等個十幾秒@@
而且其實我跟他的sql寫的差不多哈哈

利用 phpexcel 來做

這我有用過 不過我都用來讀檔把資料寫進資料庫
或把資料寫入檔案
由於報表要掛在網上
類似線上報表那樣
這個好像就用不太到!?

ckp6250 iT邦好手 1 級 ‧ 2020-02-21 16:15:22 檢舉

可是我用phpmyadmin開這個資料庫都要等個十幾秒@@

那是因為4000多個表,phpmyadmin要讀取相關訊息,自然要用許多時間,可以當您下sql指令時,理當不必用到這麼多個。

報表做成excel用不用得到?您去問會計小姐就知道了,看她們是喜歡掛在網上的,還是可以再加工的excel。

我的重點其實是在【再加工】三個字,您給小姐excel,小地方她可以自己修一下,不用每次都要找您動手。

st474ddr iT邦新手 2 級 ‧ 2020-02-21 18:02:18 檢舉

我的重點其實是在【再加工】三個字

我懂大大您意思
就是別人自己可以客製自己要的東西
因為一方面我不是做給會計的
是做給行銷的
這會是一個視覺化的報表那樣
不會隨意去變動他的欄位或位置
若是像一些財產 報稅等的報表 我確實也是用跟大大一樣的方法

其實我只是想問如果在用程式寫的報表情況下
各位大大的做法 讓小弟開開眼界而已XDD

0
一級屠豬士
iT邦大師 1 級 ‧ 2020-02-21 11:16:34

group by

看更多先前的回應...收起先前的回應...
st474ddr iT邦新手 2 級 ‧ 2020-02-21 15:04:57 檢舉

not order by?

想加就加啊.

st474ddr iT邦新手 2 級 ‧ 2020-02-21 17:57:42 檢舉

哈哈 那大大我誤會您意思了
我以為 您這樣講的意思是 兩種方法都可以用

哪來兩種,就一個select, 需要 group by就 group by,
需要order by 就order by.
select是核心.

https://ithelp.ithome.com.tw/articles/10230125

有 group by 也有 order by, 看看囉.

0
taki5000
iT邦新手 5 級 ‧ 2020-02-21 14:20:17

我的建議是...盡量少用程式寫報表, 因為改動頻率算大,
最好善用報表工具,
PHP-https://www.brilliantcode.net/550/php-reports-reporting-service-with-php/
SSRS, FineReport..etc

st474ddr iT邦新手 2 級 ‧ 2020-02-21 15:03:36 檢舉

先感謝大大的回覆

PHP-https://www.brilliantcode.net/550/php-reports-reporting-service-with-php/

PHP-Report前面player大大也有提供過
我自己有下來用用看

SSRS

主機那邊不是SQL Server QQ
用mysql配phpmyadmin

FineReport

這好像是個人化的!?

盡量少用程式寫報表

那若是要寫那種掛在網上的報表呢

taki5000 iT邦新手 5 級 ‧ 2020-02-21 15:12:43 檢舉

這樣說好了, 報表工具都可以去連非自己的DB,
可以連結多資料庫組裝, 連MySQL, SQL Server , Oracle..etc
掛在網上的報表, 可以跟報表工具請求報表產生崁入網頁,

st474ddr iT邦新手 2 級 ‧ 2020-02-21 17:59:29 檢舉

可以跟報表工具請求報表產生崁入網頁
那這樣真的值得好好研究一下
感謝大大

我要發表回答

立即登入回答