Crosstab/pivot 根据字段使用不同列数的查询

Crosstab/pivot query with different number of columns depending on a field

我需要使用一组列 headers 来旋转我的表,这些列根据输出中的一个字段而变化。

这是目前的样子:

id | Name | Test Name | Test Performed | Test Value
1    John     HIV         EIA            Reactive
1    John     HIV         EIA2           Reactive
1    John     HIV         WB             Positive
1    John     HIV         Final Kit      Positive
2    Mark     HIV         Rapid          Reactive
2    Mark     HIV         EIA            Reactive
2    Mark     HIV         EIA2           Reactive
2    Mark     HIV         Final Result   Positive
2    Mark     Immuno      CD4%           12.0%
2    Mark     Immuno      CD4 Lympo      1299
2    Mark     Immuni      CD4 Absolute   838
3    Carl     SY          RPR            Reactive
3.   Carl     SY          TPHA           Reactive

我希望它是这样的,您可以看到列根据执行的测试动态变化:

id | Name | Test Name | EIA      | EIA2   | Rapid |  WB         |Final Kit 
1    John    HIV        Reactive  Reactive           Positive
2    Mark    HIV        Reactive  Reactive           Reactive    Reactive

id | Name | Test Name | CD4% | CD4 Lympo | CD4 Absolute
1    Mark   Immuno      12.0%  1299         838 


id | Name | Test Name | RPR    | TPHA
3    Carl    SY         Reactive  Reactive

要像您正在寻找的那样进行有效的动态列查询,需要恶作剧。我之前做的方式†通常是使用一个 crosstab/pivot 查询来捕获列 numbers 之间的映射(其中你最多有一些 suitable 每个条目的最大 N) 和最后一列 标签 。其输出类似于:

Test Name   |Test Performed |Index
HIV         |EIA            |1
HIV         |EIA2           |2
[…]

然后你有另一个查询以另一种方式映射,结果如下:

Test Name   |1      |2          |3              |4      |5
HIV         |EIA    |EIA2       |Rapid          |WB     |Final Kit
Immuno      |CD4%   |CD4 Lympo  |CD4 Absolute   |       |
SY          |RPR    |TPHA       |               |       |

最后,您从 Test NameTest Performed 的第一个地图加入 Index 并从最初的 table 转向 Index 以生成交叉表,当您显示结果,在第二个映射中查找列名/Index 以获取 Test Performed

†尽管 不是 MySQL 或 C#。可转移性很有趣!

我稍后会编辑以添加示例 SQL,一旦我将其挖掘并正确地抽象出来。不过,这应该可以暂时了解总体思路。