注:爲查詢「動態」改變數或列的數據類型退回,這些必須在SQL文本進行解析時,指明這是不可能的。
要與查詢返回結果集指定的,你可以做這樣的事情:
SELECT SUM(IF(t.IdProduct='0001',t.Quantity,NULL)) AS `0001`
, SUM(IF(t.IdProduct='0002',t.Quantity,NULL)) AS `0002`
FROM mytable t
UNION ALL
SELECT SUM(IF(t.IdProduct='0001',t.TotalPrice,NULL)) AS `0001`
, SUM(IF(t.IdProduct='0002',t.TotalPrice,NULL)) AS `0002`
FROM mytable t
注意,由兩個查詢返回的數據類型將需要兼容。如果Quantity
和TotalPrice
都被定義爲整數,這將不成問題。
此外,沒有具體保證「數量」行將在「TotalPrice」行之前;我們觀察到這種行爲,它不可能會有所不同。但是,爲了保證,我們需要一個ORDER BY
條款。因此,包括一個額外的鑑別器列(每個查詢的SELECT列表中的一個字面值),這會給我們一些東西,我們可以ORDER BY。
請注意,此單個查詢不可能爲IdProduct'0003'動態創建另一列。我們需要將其添加到每個查詢的SELECT列表中。
我們可以通過兩個步驟完成此操作,使用查詢獲取不同的IdProduct列表,然後使用它來動態創建我們需要的查詢。
但......對於所有的說......我們不想這樣做。
規範模式將返回Quantity
和TotalPrice
作爲兩個單獨的列,以及作爲另一列的IdProduct
。例如,結果這個語句返回:
SELECT t.IdProduct
, SUM(t.Quantity) AS `Quantity`
, SUM(t.TotalPrice) AS `TotalPrice`
FROM mytable t
GROUP BY t.IdProduct
然後客戶端應用程序將負責改造該ResultSet到所需的顯示錶現。
我們不希望將該作業(將結果轉換爲顯示錶示形式)推送到SQL中。
僅當IdProduct被限制爲2時纔有可能?我猜不是,你後面的結果集可以在你的應用程序級代碼 – 2014-08-29 16:29:53