具有动态列的数据透视示例
Pivot sample with dynamic columns
我看过许多枢轴示例,但没有找到适用于我的情况的示例。希望有人能帮帮我。
我有这两张表
Entities Performance
+----------+--------+----------+
| idEntiry | idWeek | idResult |
+----------+--------+----------+
| 1 | 1 | 1 |
| 2 | 1 | 1 |
| 3 | 1 | 2 |
| 1 | 2 | 3 |
| 2 | 2 | 1 |
| 3 | 2 | 2 |
| 1 | 3 | 3 |
| 2 | 3 | 1 |
| … | … | … |
| 1 | 10 | 1 |
+----------+--------+----------+
周数是动态的
实体数量也是动态的
Performance details
+----------+-------------+--------+
| idResult | Description | Color |
+----------+-------------+--------+
| 1 | Bad | Red |
| 2 | Average | Yellow |
| 3 | Good | Green |
+----------+-------------+--------+
这是期望的输出
| Weeks |
+----------+---------+---------+------+---+-----+
| idEntity | 1 | 2 | 3 | … | 10 |
+----------+---------+---------+------+---+-----+
| 1 | Bad | Good | Good | … | Bad |
| 2 | Bad | Bad | Bad | … | |
| 3 | Average | Average | | … | |
+----------+---------+---------+------+---+-----+
谢谢!
这可能会帮助你接近。
DECLARE @WeekStart INT,
@WeekEnd INT
SELECT @WeekStart = MIN(idWeek),
@WeekEnd = MAX(idWeek)
FROM dbo.WeeksTable
DECLARE @WeekColumns VARCHAR(MAX)
WHILE @WeekStart < @WeekEnd
BEGIN
SET @WeekColumns = COALESCE(@WeekColumns + '],[', '[') + CONVERT(VARCHAR, @WeekStart)
SET @WeekStart = @WeekStart + 1
END
SET @WeekColumns = CONCAT(@WeekColumns,'],[',CONVERT(VARCHAR, @WeekStart),']')
DECLARE @Sql VARCHAR(MAX) = '
SELECT idEntity, ' + @WeekColumns + ' FROM
(
SELECT ep.idEntity,
ep.idWeek,
pd.Description
FROM dbo.EntitiesPerformance ep
JOIN dbo.PerformanceDetails pd on ep.idResult = pd.idResult
) src
PIVOT (
MIN(Description)
FOR idWeek IN (' + @WeekColumns + ')
) pvt
'
EXEC (@Sql)
我看过许多枢轴示例,但没有找到适用于我的情况的示例。希望有人能帮帮我。
我有这两张表
Entities Performance +----------+--------+----------+ | idEntiry | idWeek | idResult | +----------+--------+----------+ | 1 | 1 | 1 | | 2 | 1 | 1 | | 3 | 1 | 2 | | 1 | 2 | 3 | | 2 | 2 | 1 | | 3 | 2 | 2 | | 1 | 3 | 3 | | 2 | 3 | 1 | | … | … | … | | 1 | 10 | 1 | +----------+--------+----------+
周数是动态的
实体数量也是动态的
Performance details +----------+-------------+--------+ | idResult | Description | Color | +----------+-------------+--------+ | 1 | Bad | Red | | 2 | Average | Yellow | | 3 | Good | Green | +----------+-------------+--------+
这是期望的输出
| Weeks | +----------+---------+---------+------+---+-----+ | idEntity | 1 | 2 | 3 | … | 10 | +----------+---------+---------+------+---+-----+ | 1 | Bad | Good | Good | … | Bad | | 2 | Bad | Bad | Bad | … | | | 3 | Average | Average | | … | | +----------+---------+---------+------+---+-----+
谢谢!
这可能会帮助你接近。
DECLARE @WeekStart INT,
@WeekEnd INT
SELECT @WeekStart = MIN(idWeek),
@WeekEnd = MAX(idWeek)
FROM dbo.WeeksTable
DECLARE @WeekColumns VARCHAR(MAX)
WHILE @WeekStart < @WeekEnd
BEGIN
SET @WeekColumns = COALESCE(@WeekColumns + '],[', '[') + CONVERT(VARCHAR, @WeekStart)
SET @WeekStart = @WeekStart + 1
END
SET @WeekColumns = CONCAT(@WeekColumns,'],[',CONVERT(VARCHAR, @WeekStart),']')
DECLARE @Sql VARCHAR(MAX) = '
SELECT idEntity, ' + @WeekColumns + ' FROM
(
SELECT ep.idEntity,
ep.idWeek,
pd.Description
FROM dbo.EntitiesPerformance ep
JOIN dbo.PerformanceDetails pd on ep.idResult = pd.idResult
) src
PIVOT (
MIN(Description)
FOR idWeek IN (' + @WeekColumns + ')
) pvt
'
EXEC (@Sql)