mysql - 如何生成具有动态列的视图(需要通过引用表的行来创建列)
问题描述
我有两张桌子 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)
解决方案
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 代码。
推荐阅读
- java - 休眠实体发现仅在同一文件夹内有效
- java - 历史上的高错误率会导致 Google 日历 API 超时吗?
- c++ - 将 QGraphicsView 或 Scene 转为 XML/JSON
- date - 如何使用谷歌表格公式检查日期是否满足重复条件
- python - Django SECRET_KEY 环境变量始终为空
- web - 我的网站与不同的 IP 不同(美国与韩国)
- reactjs - 反应高阶组件在打字稿中不起作用
- c++ - 我想在 C++ 中对单链表进行冒泡排序,但我一直面临左值错误,我无法解决它
- ios - Xcode 11:将 Xcode 10 更新为 Xcode 11 后的显示问题
- javascript - 在 WebCrypto 中使用 AES-CBC 时,为什么错误的密钥会导致 OperationError,而错误的密文或 IV 不会?