2013-06-25 76 views
0

我想写一个存储过程来从数据库中拉出一些聚合统计信息。使用动态选择mysql的存储过程的列

我想修改程序以允许动态选择列。

我的第一个想法是使用案例或IF语句来选择不同的列

DELIMITER// 
CREATE PROCEDURE 'procStats'(IN buySell varchar(4)) 
SELECT 

    CASE 
     WHEN buySell = 'Buy' THEN AVG(salesTransactions.BuyPrice) AS AveragePrice, 
     WHEN buySell = 'Sell' THEN AVG(salesTransactions.SellPrice) AS AveragePrice, 
    END CASE; 

    MONTHNAME(salesTransactions.DateOfTransaction) as TransactionMonth 
FROM 
    salesTransactions 
GROUP BY 
    TransactionMonth 
LIMIT 6; 
END// 

现在我不认为case语句用于这一目的,它目前不工作.. 。是否有可能实现上述?

仅供参考 - 我完全知道,我可以只选择两列,但我不希望公开两列到我的web应用程序。

回答

0

更改此

CASE 
    WHEN buySell = 'Buy' THEN AVG(salesTransactions.BuyPrice) AS AveragePrice, 
    WHEN buySell = 'Sell' THEN AVG(salesTransactions.SellPrice) AS AveragePrice, 
END CASE; 

CASE buySell 
    WHEN 'Buy' THEN AVG(salesTransactions.BuyPrice) 
    WHEN 'Sell' THEN AVG(salesTransactions.SellPrice) 
END AS AveragePrice, 

最后,它应该是这样的:

DELIMITER// 
CREATE PROCEDURE procStats (IN buySell varchar(4)) 
BEGIN 
SELECT 

    CASE buySell 
     WHEN 'Buy' THEN AVG(salesTransactions.BuyPrice) 
     WHEN 'Sell' THEN AVG(salesTransactions.SellPrice) 
    END AS AveragePrice, 

    MONTHNAME(salesTransactions.DateOfTransaction) as TransactionMonth 
FROM 
    salesTransactions 
GROUP BY 
    TransactionMonth 
LIMIT 6; 
END// 

我修正了一些语法错误。

+0

嗨,谢谢你的建议。我担心这会是答案。只是认为这将是很多代码重复考虑所有需要改变的是1列(1行代码) – Gravy

+0

@Gravy更新了我的答案。我不在意了:) – fancyPants

+0

OOOH,这看起来不错...我会尽快找到正确的答案并标记出正确的答案。感谢帮助。 – Gravy