好吧,我会尽可能简单地解释一下。
我有一个名为 approval_levels 的表,其中有 2 列:
|LEVEL_ID |NAME |
|1 |app_level_1 |
|2 |app_level_2 |
|3 |app_level_3 |
我有第二个表叫做 requests,其中有 3 列:
|REQUEST_ID |PRODUCT_NAME |MANUFACTURER |
|1 |wd-40 |Acme |
|2 |Windex |Acme |
|3 |Propane |Acme |
我有第三个表链接两个名为 request_approvals 的表,它有两列:REQUEST_ID、LEVEL_ID。当特定级别的请求获得批准时,我会在该表中插入一个值。因此,例如,假设请求 1 已获得所有 3 个级别的批准,请求 2 仅获得级别 1 的批准,请求 3 已获得级别 3 的批准,表格将显示如下内容。
|REQUEST_ID |LEVEL_ID |
|1 |1 |
|1 |2 |
|1 |3 |
|2 |1 |
|3 |3 |
好的,挑战来了:我需要在报告中显示所有请求,为每个级别创建一个列,并显示该请求是否在该级别获得批准。最终结果必须是这样的:
|REQUEST_ID |PRODUCT_NAME |MANUFACTURER |app_level_1 |app_level_2 |app_level_3 |
|1 |wd-40 |Acme |X |X |X |
|2 |Windex |Acme |X | | |
|3 |Propane |Acme | | |X |
请记住,如果将另一个值添加到 approval_levels 表(即 app_level_4),我需要将另一列添加到表中动态调用 app_level_4。
现在,我到底该如何做这样的事情???我什至不知道从哪里开始寻找?
感谢您的帮助!
最佳答案
如果您使用的是 SQL Server,请查看 PIVOT 命令。我只是自己写了其中一个,所以我修改了它以适合您的表结构:
DECLARE @COLUMNS NVARCHAR(MAX)
DECLARE @SQL NVARCHAR(MAX)
SELECT @COLUMNS = COALESCE(@COLUMNS + ', ','') + QUOTENAME(NAME) FROM approval_levels
SELECT @SQL = N'
SELECT REQUEST_ID, PRODUCT_NAME, MANUFACTURER, ' + @COLUMNS + '
FROM (
SELECT
r.REQUEST_ID,
r.PRODUCT_NAME,
r.MANUFACTURER,
a.NAME
FROM
request_approvals ra
INNER JOIN approval_levels a ON a.LEVEL_ID = ra.LEVEL_ID
INNER JOIN requests r ON r.REQUEST_ID = ra.REQUEST_ID
) p
PIVOT(COUNT(NAME) FOR NAME IN ( ' + @COLUMNS + ' )
) AS pvt'
EXEC sp_executesql @SQL
关于mysql - 从另一个查询的结果中向查询添加列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23074073/