行轉列的一種優化思路
在論壇看到一個帖子,需求是行轉列。
但是表中的資料是千萬級別的,執行很慢。
樓主的SQL
newkid大神優化的SQL
優化的思路就是
sum和表掃描省略不了,
但是可以通過兩次分組,省下千萬次的case when判斷
參考:
http://www.itpub.net/thread-1781658-1-1.html
但是表中的資料是千萬級別的,執行很慢。
樓主的SQL
-
set linesize 300;
-
set pagesize 300;
-
WITH t AS
-
(
-
SELECT 'shop001' AS shopcode, 'store002' storecode,101 b_ID, 2 num,10.5 price FROM dual
-
UNION ALL
-
SELECT 'shop001' AS shopcode, 'store003' storecode,101 b_ID, 12 num,8 price FROM dual
-
UNION ALL
-
SELECT 'shop002' AS shopcode, 'store002' storecode,105 b_ID, 8 num,12.5 price FROM dual
-
UNION ALL
-
SELECT 'shop001' AS shopcode, 'store003' storecode,101 b_ID, 20 num,19 price FROM dual
-
UNION ALL
-
SELECT 'shop001' AS shopcode, 'store002' storecode,101 b_ID, 22 num,7 price FROM dual
-
UNION ALL
-
SELECT 'shop002' AS shopcode, 'store003' storecode,105 b_ID, 7 num,6 price FROM dual
-
UNION ALL
-
SELECT 'shop001' AS shopcode, 'store003' storecode,101 b_ID, 10 num,3 price FROM dual
-
UNION ALL
-
SELECT 'shop001' AS shopcode, 'store002' storecode,106 b_ID, 15 num,8 price FROM dual
-
)
-
select shopcode,storecode,
-
sum(case when b_id=101 then num end) a,
-
sum(case when b_id=105 then num end) b,
-
sum(case when b_id=106 then num end) c,
-
sum(case when b_id=101 then num*price end) ,
-
sum(case when b_id=105 then num*price end) d,
-
sum(case when b_id=106 then num*price end) e
-
from t
-
GROUP BY shopcode,storecode;
- exit;
newkid大神優化的SQL
-
set linesize 300;
-
set pagesize 300;
-
WITH t AS
-
(
-
SELECT 'shop001' AS shopcode, 'store002' storecode,101 b_ID, 2 num,10.5 price FROM dual
-
UNION ALL
-
SELECT 'shop001' AS shopcode, 'store003' storecode,101 b_ID, 12 num,8 price FROM dual
-
UNION ALL
-
SELECT 'shop002' AS shopcode, 'store002' storecode,105 b_ID, 8 num,12.5 price FROM dual
-
UNION ALL
-
SELECT 'shop001' AS shopcode, 'store003' storecode,101 b_ID, 20 num,19 price FROM dual
-
UNION ALL
-
SELECT 'shop001' AS shopcode, 'store002' storecode,101 b_ID, 22 num,7 price FROM dual
-
UNION ALL
-
SELECT 'shop002' AS shopcode, 'store003' storecode,105 b_ID, 7 num,6 price FROM dual
-
UNION ALL
-
SELECT 'shop001' AS shopcode, 'store003' storecode,101 b_ID, 10 num,3 price FROM dual
-
UNION ALL
-
SELECT 'shop001' AS shopcode, 'store002' storecode,106 b_ID, 15 num,8 price FROM dual
-
)
-
select shopcode,storecode,
-
sum(case when b_id=101 then s1 end) a,
-
sum(case when b_id=105 then s1 end) b,
-
sum(case when b_id=106 then s1 end) c,
-
sum(case when b_id=101 then s2 end) ,
-
sum(case when b_id=105 then s2 end) d,
-
sum(case when b_id=106 then s2 end) e
-
from(
-
SELECT SHOPCODE, STORECODE, B_ID, SUM(num) S1, SUM(num * price) S2
-
FROM t
-
GROUP BY SHOPCODE, STORECODE, B_ID
-
)
-
GROUP BY SHOPCODE, STORECODE;
-
exit;
-
優化的思路就是
sum和表掃描省略不了,
但是可以通過兩次分組,省下千萬次的case when判斷
參考:
http://www.itpub.net/thread-1781658-1-1.html
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1160880/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 行轉列計算差值的一種優化優化
- 一種小程式弱網離線優化的思路優化
- 第七篇:使用 CUDA 進行計算優化的兩種思路優化
- 一個MySQL優化案例的初步思路MySql優化
- 一種新的程式設計思路(中): (轉)程式設計
- 一種新的程式設計思路(上) (轉)程式設計
- 系統的優化思路優化
- MySQL union的一種優化MySql優化
- 一種更好的優化方式優化
- 一種新的程式設計思路(中)附: (轉)程式設計
- 【效能優化】消除行連結和行遷移的思路和方法優化
- 慢Sql優化思路SQL優化
- Mysql資料庫優化系列(一)------Mysql伺服器優化思路MySql資料庫優化伺服器
- 優先佇列的一種實現方式—堆佇列
- JAVA效能優化思路探究Java優化
- 【Java效能優化思路方向】Java優化
- Spark SQL中列轉行(UNPIVOT)的兩種方法SparkSQL
- SQL優化--用各種hints優化一條SQLSQL優化
- 一個行轉列的應用
- leetcode621——優先佇列的思路LeetCode佇列
- SQL 行轉列,列轉行SQL
- Mysql - 行轉列、列轉行MySql
- 淺談前端優化的幾個思路前端優化
- 貼合生產的MySql優化思路MySql優化
- 資料訪問層的優化思路優化
- latch:cache buffers chains的優化思路AI優化
- [轉發][非原創]oschina上的一種雙快取思路快取
- 一種跳板機的實現思路
- SQL優化例項-思路分析SQL優化
- Oracle優化案例-儲存過程的優化思路(二十三)Oracle優化儲存過程
- oracle 11g的行轉列、列轉行Oracle
- sql的行轉列(PIVOT)與列轉行(UNPIVOT)SQL
- 一種軟體加密思路加密
- 【轉】【效能最佳化】消除行連結和行遷移的思路和方法
- SQL優化思路&結果集重用優化、分割槽索引優化測試SQL優化索引
- [轉]轉一個關於優化sql的文章優化SQL
- MySQL查詢中分頁思路的優化BFMySql優化
- 關於Execute to Parse %:比例太低的優化思路優化