2010-07-09 21 views
1

我正在玩pdf中第6頁的Peter Brawley found here所寫文章中的一些代碼。我試圖弄清楚如何自動化它,以便過程的結果自動放置在select查詢中。現在我正在調用過程,將結果導出到文本文件中,手動進入文本文件(用鼠標點擊),複製結果並將其粘貼到select語句中。我一直無法知道如何將select語句插入到過程中,或者將過程放入我可以從select語句調用的數據庫或變量中的表中。有任何想法嗎?自動將被調用過程的結果放入select語句中

下面是從彼得·布勞利示例代碼,我一直在試圖自動化:

use database; 
DROP PROCEDURE IF EXISTS writesumpivot; 
DELIMITER | 
CREATE PROCEDURE writesumpivot(
    db CHAR(64), tbl CHAR(64), pivotcol CHAR(64), sumcol CHAR(64) 
) 
BEGIN 
DECLARE datadelim CHAR(1) DEFAULT '"'; 
DECLARE comma CHAR(1) DEFAULT ','; 
DECLARE singlequote CHAR(1) DEFAULT CHAR(39); 
SET @sqlmode = (SELECT @@sql_mode); 
SET @@sql_mode=''; 
SET @pivotstr = CONCAT('SELECT DISTINCT CONCAT(', singlequote, 
        ',SUM(IF(', pivotcol, ' = ', datadelim, singlequote, 
        comma, pivotcol, comma, singlequote, datadelim, 
        comma, sumcol, ',0)) AS `', 
        singlequote, comma, pivotcol, comma, singlequote, '`', 
        singlequote, ') AS sumpivotarg FROM ', db, '.', tbl, 
        ' WHERE ', pivotcol, ' IS NOT NULL'); 
-- UNCOMMENT TO SEE THET MIDLEVEL SQL: 
-- SELECT @pivotstr; 
PREPARE stmt FROM @pivotstr; 
EXECUTE stmt; 
drop prepare stmt; 
SET @@[email protected]; 
END 
| 
DELIMITER ; 
call writesumpivot('database', 'table', 'pivotcol','sumcol'); 

然後Select語句如下:

SELECT 
    infoField 
    [results of the call] 
FROM 
    database.table 
GROUP BY infoField; 

假設我已經跑了調用,導出結果,複製它們並將它們粘貼到select語句中,我在SELECT查詢中調用的個人結果將如下所示:

SELECT 
    infoField 
    ,SUM(IF(pivotcol = "Yellow",sumcol,0)) AS `Yellow` 
    ,SUM(IF(pivotcol = "Red",sumcol,0)) AS `Red` 
    ,SUM(IF(pivotcol = "Purple",sumcol,0)) AS `Purple` 
    ,SUM(IF(pivotcol = "Orange",sumcol,0)) AS `Orange` 
    ,SUM(IF(pivotcol = "Green",sumcol,0)) AS `Green` 
    ,SUM(IF(pivotcol = "Blue",sumcol,0)) AS `Blue` 
    ,SUM(IF(pivotcol = "White",sumcol,0)) AS `White` 
FROM database.table 
GROUP BY infoField; 

運行上面的select語句給了我需要的數據透視表。我試圖弄清楚如何將其納入網站,這就是爲什麼它需要自動化。

我嘗試插入一個創建表,然後引用表,但沒有得到想要的結果。 編輯程序的最後一節,如下所示:

--SELECT @pivotstr; 
DROP TABLE IF EXISTS temp2; 
CREATE TABLE IF NOT EXISTS temp2(sumpivotarg varchar(8000)); 
PREPARE stmt FROM @pivotstr; 
... 

改變呼叫並選擇如下:從這個

call writesumpivot('database','table','pivotcol','sumcol'); 
insert into temp2(sumpivotarg) values(@pivotstr); 

SELECT 
    table.infoField, temp2.sumpivotarg 
FROM table, temp2 
GROUP BY infoField 

結果的通用代碼,而不是在數據庫中的單元格的內容總結。它看起來像這樣:

infoField | sumpivotarg < - Col標題

123 | SELECT DISTINCT CONCAT('Sum(if(pivotcol =「,pivotcol」,sumcol,0))AS 'pivotcol,'')..

124 | SELECT DISTINCT CONCAT('Sum(if(pivotcol =「,pivotcol」,sumcol,0))AS 'pivotcol,'')..

125 | SELECT DISTINCT CONCAT( 'SUM(IF(pivotcol = 「pivotcol」,sumcol,0))AS 'pivotcol,'')..

+0

請添加一些示例代碼 – jigfox 2010-07-09 17:09:56

回答

0

你可以在你的數據庫創建臨時表。作爲存儲過程執行的結果,使用SQL插入將數據插入臨時表中。之後,您可以在您的select語句中使用該臨時表。

這裏有一個答案,說明如何做到這一點:

Use result set of mysql stored procedure in another stored procedure

僅舉一個類似的問題:

MySQL How to INSERT INTO temp table FROM Stored Procedure

+0

我在這個很新。我試圖創建一個臨時表,但它不會顯示,最後插入語句以刪除表(如果存在),如果不存在,則創建一個名爲temp2的新表。它將在調用過程時創建表,以便工作。 在程序結束時,它具有以下代碼: PREPARE stmt FROM @sql; EXECUTE stmt; INSERT INTO temp2(sumpivotarg)VALUES(@sql); drop prepare stmt; SET @@ sql_mode = @ sqlmode; END; 我添加了INSERT語句。沒有語法錯誤,但表格是空的。我不知道如何將信息放入表格。 – Terri 2010-07-12 14:57:20

+0

Terri:向我展示您的代碼,以便我可以幫助您...您可以將代碼粘貼到您的問題中。 – 2010-07-13 07:47:26

+0

好的。更新後顯示代碼。 – Terri 2010-07-13 18:35:47

1

我並不意味着對MySQL的任何不敬,但這整個寫入臨時表的解決方案用於在存儲過程之間傳遞表格數據是不理想和危險的(在現實世界的事務處理中)。我真的希望mySQL團隊能夠構建一些企業級存儲過程功能。另外,mySQL函數不能返回表是一個明顯的缺點。

我一直在慢慢地將流程從MSSQL遷移到Linux和mySQL。程序和函數部門中mySQL的缺點是強制一些重要的kludgey類型重寫(ala臨時表和全局變量等)。

我一直在寫SP大約20年(SQL Server之前的Sybase),並且強烈地感覺到使用動態SQL沒有利用服務器端數據庫。許多人嘗試在客戶端實現數據層,但服務器更適合執行此任務。這是功能和數據的自然分工。此外,同時在服務器上運行多個預編譯的調用比對服務器的重複調用(針對相同的進程)要優越得多。

來吧MySQL的團隊,我保持我的手指穿過....

相關問題