MySQL動態透視:將行轉換為列
在MySQL中,您可能需要透視表,將行轉換為列。當您需要以不同的方向表示數據時,這尤其有用。雖然MySQL本身並不提供PIVOT函數,但有幾種方法可以完成此任務。
挑戰:動態透視表
假設您有三個表:產品表、合作夥伴表和銷售表。您需要創建一個表,以合作夥伴為行,產品為列,計算每個組合相關的銷售數量。
使用CASE語句
一種方法是使用帶CASE語句的聚合函數。通過創建多個CASE語句,您可以計算每種產品的銷售額,並按合作夥伴名稱分組結果。
<code class="language-sql">SELECT pt.partner_name, COUNT(CASE WHEN pd.product_name = 'Product A' THEN 1 END) AS ProductA, COUNT(CASE WHEN pd.product_name = 'Product B' THEN 1 END) AS ProductB, COUNT(CASE WHEN pd.product_name = 'Product C' THEN 1 END) AS ProductC, COUNT(CASE WHEN pd.product_name = 'Product D' THEN 1 END) AS ProductD, COUNT(CASE WHEN pd.product_name = 'Product E' THEN 1 END) AS ProductE FROM partners pt LEFT JOIN sales s ON pt.part_id = s.partner_id LEFT JOIN products pd ON s.product_id = pd.prod_id GROUP BY pt.partner_name;</code>
使用預處理語句實現動態透視
對於產品數量未知且動態變化的情況,您可以使用預處理語句。通過動態生成SQL查詢,您可以根據可用的產品調整列數。
<code class="language-sql">SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'COUNT(CASE WHEN Product_Name = ''', Product_Name, ''' THEN 1 END) AS ', REPLACE(Product_Name, ' ', '') ) ) INTO @sql FROM products; SET @sql = CONCAT('SELECT pt.partner_name, ', @sql, ' FROM partners pt LEFT JOIN sales s ON pt.part_id = s.partner_id LEFT JOIN products pd ON s.product_id = pd.prod_id GROUP BY pt.partner_name'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;</code>
限制和注意事項
需要注意的是,GROUP_CONCAT
默認字節限制為 1024。如果連接的字符串超過此限制,您可能需要使用 SET @@group_concat_max_len = 32000;
來增加限制。
以上是如何在 MySQL 中動態透視表?的詳細內容。更多資訊請關注PHP中文網其他相關文章!