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 Name
和 Test Performed
的第一个地图加入 Index
并从最初的 table 转向 Index
以生成交叉表,当您显示结果,在第二个映射中查找列名/Index
以获取 Test Performed
。
†尽管 不是 MySQL 或 C#。可转移性很有趣!
我稍后会编辑以添加示例 SQL,一旦我将其挖掘并正确地抽象出来。不过,这应该可以暂时了解总体思路。
我需要使用一组列 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 Name
和 Test Performed
的第一个地图加入 Index
并从最初的 table 转向 Index
以生成交叉表,当您显示结果,在第二个映射中查找列名/Index
以获取 Test Performed
。
†尽管 不是 MySQL 或 C#。可转移性很有趣!
我稍后会编辑以添加示例 SQL,一旦我将其挖掘并正确地抽象出来。不过,这应该可以暂时了解总体思路。