首页 > 解决方案 > 如何生成具有动态列的视图(需要通过引用表的行来创建列)

问题描述

我有两张桌子 A 和 B。A 有所有列出的果汁及其价格,B 有服务类型和相同的价格抵消。

表 A 示例

# ID 姓名 价格
2 柠檬 015.00
3 菠萝 015.00
4 葡萄 015.00
5 莫桑比 025.00
6 025.00
7 西瓜 018.00
8 萝卜 035.00
9 番木瓜 018.00
10 香蕉 018.00
11 奶油苹果 015.00
12 香瓜 018.00
13 芒果 025.00
14 黄油水果 020.00
15 苹果 025.00

表 B 示例

# ID 服务名称 price_offset
1 小的 0.50
2 常规的 1.00
3 中等的 2.00
4 大的 4.00

我想要一个像

# 姓名 小份 定期发球 中等服务 大份
萝卜 17.5000 35.0000 70.0000 140.0000
葡萄 7.5000 15.0000 30.0000 60.0000
柠檬 7.5000 15.0000 30.0000 60.0000
莫桑比 12.5000 25.0000 50.0000 100.0000
12.5000 25.0000 50.0000 100.0000
菠萝 7.5000 15.0000 30.0000 60.0000
西瓜 9.0000 18.0000 36.0000 72.0000

我希望当前语句动态地将服务器类型添加为列并计算单个果汁的价格,而不是我手动提及它。

 SELECT 
        f.name AS name,
        (select st.price_offset * f.price from serve_types st where st.serve_name = 'small') as "small serve",
        (select st.price_offset * f.price from serve_types st where st.serve_name = 'regular') as "regular serve",
        (select st.price_offset * f.price from serve_types st where st.serve_name = 'medium') as "medium serve",
        (select st.price_offset * f.price from serve_types st where st.serve_name = 'large') as "large serve"
    FROM
        fruits f
    WHERE
        (f.milkshakeable = 0)

标签: mysql

解决方案


CREATE PROCEDURE generate_report ()
BEGIN
SELECT CONCAT('SELECT f.name AS name,',
              GROUP_CONCAT('\n(select st.price_offset * f.price ',
                           'from serve_types st where st.serve_name = ''',
                           serve_name,
                           ''') as `',
                           serve_name,
                           ' serve`' ORDER BY id),
              '\nFROM fruits f')
FROM serve_types
INTO @sql;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DROP PREPARE stmt;
END

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=760354721da6e5cb748261e2312536f0

您可以添加设置一些过滤的 SP 参数(如WHERE (f.milkshakeable = 0)在您的代码中)并相应地修改生成的 SQL 代码。


推荐阅读