iT邦幫忙

0

請教LOG排序的Oracle SQL

  • 分享至 

  • xImage

各位大大好,最近在寫一個LOG排序的Oracle SQL,但是小弟SQL弱弱的,所以請高手救命

SQL語法
SELECT B.NO,B.LOGACTION,B.LOGTIME FROM MAIN A, LOG B WHERE A.NO = B.NO and to_char(A.Time,'yyyy')='2022' ORDER BY B.NO,B.LOGTIME ASC

資料截圖
https://ithelp.ithome.com.tw/upload/images/20220207/201463206cNYE80DNz.jpg

希望能排列成如下
https://ithelp.ithome.com.tw/upload/images/20220207/20146320XADG6CzmGW.jpg

想請教各位大大
1.如何下Oracle SQL語法才能顯示出圖二的結果
2.因為LOG資料會隨活動增減,要如何橫向將所有LOG都顯示出來?
再麻煩各位大大了,獻上十萬分感謝,跪~~


感謝大師迅速的回覆!
趕緊補上sql
create table Main(
NO varchar2(10), --編號
ITEM varchar2(30), --項目
);

create table LOG(
NO varchar2(10), --編號
LOGACTION varchar2(20), --活動
LOGTIME DATE --日期時間
);

insert into Main (NO, ITEM) values ('A01', '項目1');
insert into Main (NO, ITEM) values ('A02', '項目2');

insert into LOG (NO, LOGACTION, LOGTIME) values ('A01', '轉IT', Datetime.now);
insert into LOG (NO, LOGACTION, LOGTIME) values ('A01', '退回', Datetime.now);
insert into LOG (NO, LOGACTION, LOGTIME) values ('A02', '轉IT', Datetime.now);
insert into LOG (NO, LOGACTION, LOGTIME) values ('A02', '分文', Datetime.now);
insert into LOG (NO, LOGACTION, LOGTIME) values ('A02', '改分', Datetime.now);

弟拜讀了大師的連結,但弟不才試了一下:
select A.Item,B.NO,listagg(LOGTIME||','||LOGACTION||';') within group(order by LOGTIME) LOGS from Main A, LOG B where A.NO=B.NO AND to_char(A.tFillTime,'yyyy')='2022' group by B.NO;
無法顯示資料,系統回覆 "ORA-00979:不是一個GROUP BY表示式",
請問大師弟該怎麼做是好?
萬分感謝~

================= 我是分隔線 ====================
感謝各位大大熱心提供專業的意見,弟銘感五內,說實在的確是長官要求的...><
弟用LISTAGG()的方法做出來了,上面又要求日期格式需顯示年月日時分,DB內存的資料是"2022/1/3 上午 11:42:20"(資料型別是DATE),但是用LISTAGG()取出資料就變成"13-1月 -22"了,請問要如何顯示原本DB內存的日期時間呢?
叩謝各位大大的大恩!

1.問SQL問題,別只貼圖,你的資料要別人手打一遍,這樣就減少回答的動力了.
2.這有幾個方向可以解,一個是用 LISTAGG()
https://docs.oracle.com/cd/E11882_01/server.112/e41084/functions089.htm#SQLRF30030
或是 JSON_ARRAYAGG()
https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/JSON_ARRAYAGG.html#GUID-6D56077D-78DE-4CC0-9498-225DDC42E054
JSON的方式要比較新一點的版本.
3.有些時候就會有人很堅持的一定要變成好幾個欄位,要放到Excel去.
那就需要一個對照表,才好去做對照,不然就是很麻煩的手動寫一堆來組合.
尼克 iT邦大師 1 級 ‧ 2022-02-08 09:40:05 檢舉
insert into LOG (NO, LOGACTION, LOGTIME) values ('A01', '轉IT', Datetime.now);
Oracle 有datetime.now 這函式嗎?應該是sysdate吧!
尼克 iT邦大師 1 級 ‧ 2022-02-09 09:05:08 檢舉
建議你應該貼出正確的程式,並且選擇有幫助你的人為正解。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

5
一級屠豬士
iT邦大師 1 級 ‧ 2022-02-07 22:31:13
最佳解答
看更多先前的回應...收起先前的回應...

如果這麼無意義的格式都lay的出來
我來預測之後樓主可能的要求:
1.對齊比較好看:不要合併,分成不同欄位
2.要看最新狀態:依時間排序,最新的在最左邊(最前面)
3.對齊比較好看:相同狀態排在同一欄,無該狀態則留空白
4.減少螢幕捲動:若超過螢幕寬度,做個「單筆多列」或「分頁」
/images/emoticon/emoticon10.gif

尼克 iT邦大師 1 級 ‧ 2022-02-08 09:42:56 檢舉

我被要求過,而且使用PLSQL拋出html格式,轉發到郵件收發!

大大新春愉快. 別提供這樣多點子.

海綿寶寶 尼克
兩位大大,新春愉快,虎虎生風.

Oracle 有 mail 的功能
https://docs.oracle.com/cd/B19306_01/appdev.102/b14258/u_mail.htm#BABFJJBD
更早以前沒這個,只有網路功能,mail部分要自己加工一下.
我以前是習慣會讓Oracle DB 排程產生Statspack report,
然後email出來.這樣就能很方便看到哪些SQL吃掉比較多資源,
進而做優化或是調整.
這裡有篇我寫的PG Event Trigger,使用PL/Python 傳送訊息到
telegram的.
https://hackmd.io/@pgsql-tw/HkLR1yOYO

也有做過Oracle做完備份,發訊息到 LINE,Slack這些.

一級屠豬士

我百分之百清楚明白大師SQL的造詣高度
我只是看不慣老是有人把「資料」和「格式」混成瀨尿牛丸
隨口畫畫虎蘭,請別當真

拜個早年,祝大大兔年行大運
/images/emoticon/emoticon64.gif

尼克 iT邦大師 1 級 ‧ 2022-02-08 10:31:42 檢舉

/images/emoticon/emoticon12.gif

尼克 iT邦大師 1 級 ‧ 2022-02-08 10:35:14 檢舉

一級屠豬士
感謝提供進階功能。
海綿寶寶
有時候老闆真是會把資料的呈現當成excel功能那樣簡單。

資料的查詢與展現,最好是分開,例如使用報表軟體等方式來展現會較為靈活.
直轉橫這類需求也一直都會有,其實這裡也出現過不少.
最近幾年 JSON 格式已經列出 ANSI SQL 標準了,所以各大主流DB,
都在完善這方面.之後就可以方便的由DB產生一些JSON格式,後續其他再接手展現.

尼克 iT邦大師 1 級 ‧ 2022-02-08 11:15:24 檢舉

一級屠豬士
最近幾年 JSON 格式已經列出 ANSI SQL 標準了,所以各大主流DB?
有新資訊可以學習嗎?

尼克 iT邦大師 1 級 ‧ 2022-02-08 13:56:13 檢舉

/images/emoticon/emoticon41.gif

我要發表回答

立即登入回答