MYSQL API之 WITH ROLLUP,mysqlrollup

來源:互聯網
上載者:User

MYSQL API之 WITH ROLLUP,mysqlrollup

GROUP BY子句允許一個將額外行添加到簡略輸出端 WITH ROLLUP 修飾符。這些行代表高層(或高聚集)簡略操作。ROLLUP 因而允許你在多層分析的角度回答有關問詢的問題。例如,它可以用來向OLAP (線上分析處理) 操作提供支援。

設想一個名為sales 的表具有年份、國家、產品及記錄銷售利潤的利潤列:

CREATE TABLE sales

(

    year    INT NOT NULL,

    country VARCHAR(20) NOT NULL,

    product VARCHAR(32) NOT NULL,

    profit  INT

);

可以使用這樣的簡單GROUP BY,每年對錶的內容做一次總結:

mysql> SELECT year, SUM(profit) FROM sales GROUP BY year;

+------+-------------+

| year | SUM(profit) |

+------+-------------+

| 2000 |        4525 |

| 2001 |        3010 |

+------+-------------+

這個輸出結果顯示了每年的總利潤, 但如果你也想確定所有年份的總利潤,你必須自己累加每年的單個值或運行一個加法詢問。

或者你可以使用 ROLLUP, 它能用一個問詢提供雙層分析。將一個 WITH ROLLUP修飾符添加到GROUP BY 語句,使詢問產生另一行結果,該行顯示了所有年份的總價值:

mysql> SELECT year, SUM(profit) FROM sales GROUP BY year WITH ROLLUP;

+------+-------------+

| year | SUM(profit) |

+------+-------------+

| 2000 |        4525 |

| 2001 |        3010 |

| NULL |        7535 |

+------+-------------+

總計高聚集行被年份列中的NULL值標出。

當有多重 GROUP BY 列時,ROLLUP產生的效果更加複雜。這時,每次在除了最後一個分類列之外的任何列出現一個 “break” (值的改變) ,則問訊會產生一個高聚集累計行。

例如,在沒有 ROLLUP的情況下,一個以年、國家和產品為基礎的關於 sales 表的一覽表可能如下所示:

mysql> SELECT year, country, product, SUM(profit)

    -> FROM sales

    -> GROUP BY year, country, product;

+------+---------+------------+-------------+

| year | country | product    | SUM(profit) |

+------+---------+------------+-------------+

| 2000 | Finland | Computer   |        1500 |

| 2000 | Finland | Phone      |         100 |

| 2000 | India   | Calculator |         150 |

| 2000 | India   | Computer   |        1200 |

| 2000 | USA     | Calculator |          75 |

| 2000 | USA     | Computer   |        1500 |

| 2001 | Finland | Phone      |          10 |

| 2001 | USA     | Calculator |          50 |

| 2001 | USA     | Computer   |        2700 |

| 2001 | USA     | TV         |         250 |

+------+---------+------------+-------------+

表示總值的輸出結果僅位於年/國家/產品的分析層級。當添加了 ROLLUP後, 問詢會產生一些額外的行:

mysql> SELECT year, country, product, SUM(profit)

    -> FROM sales

    -> GROUP BY year, country, product WITH ROLLUP;

+------+---------+------------+-------------+

| year | country | product    | SUM(profit) |

+------+---------+------------+-------------+

| 2000 | Finland | Computer   |        1500 |

| 2000 | Finland | Phone      |         100 |

| 2000 | Finland | NULL       |        1600 |

| 2000 | India   | Calculator |         150 |

| 2000 | India   | Computer   |        1200 |

| 2000 | India   | NULL       |        1350 |

| 2000 | USA     | Calculator |          75 |

| 2000 | USA     | Computer   |        1500 |

| 2000 | USA     | NULL       |        1575 |

| 2000 | NULL    | NULL       |        4525 |

| 2001 | Finland | Phone      |          10 |

| 2001 | Finland | NULL       |          10 |

| 2001 | USA     | Calculator |          50 |

| 2001 | USA     | Computer   |        2700 |

| 2001 | USA     | TV         |         250 |

| 2001 | USA     | NULL       |        3000 |

| 2001 | NULL    | NULL       |        3010 |

| NULL | NULL    | NULL       |        7535 |

+------+---------+------------+-------------+

對於這個問詢, 添加ROLLUP 子句使村輸出結果包含了四層分析的簡略資訊,而不只是一個下面是怎樣解釋  ROLLUP輸出:

  • 一組給定的年份和國家的每組產品行後面, 會產生一個額外的合計列, 顯示所有產品的總值。這些行將產品列設定為 NULL。
  • 一組給定年份的行後面,會產生一個額外的合計列,顯示所有國家和產品的總值。這些行將國家和產品列設定為  NULL。
  • 最後, 在所有其它行後面,會產生一個額外的總計列,顯示所有年份、國家及產品的總值。 這一行將年份、國家和產品列設定為 NULL。

使用ROLLUP 時的其它注意事項

以下各項列出了一些MySQL執行ROLLUP的特殊狀態: 

當你使用 ROLLUP時, 你不能同時使用 ORDER BY子句進行結果排序。換言之, ROLLUP 和ORDER BY 是互斥的。然而,你仍可以對排序進行一些控制。在 MySQL中, GROUP BY 可以對結果進行排序,而且你可以在GROUP BY列表指定的列中使用明確的 ASC和DESC關鍵詞,從而對個別列進行排序。 (不論如何排序被ROLLUP添加的較進階別的合計列仍出現在它們被計算出的行後面)。  

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.