SQL 服务器动态旋转到 return 每个类别一行
SQL Server dynamic Pivot to return one row for each category
我的数据库是 SQL Server 2016。我们在 Excel 工作簿中接收源数据。包含源数据的工作表有四列。 EFFDATE
对于所有负载类型和 Trans 都是通用的。这就是 EFFDATE
.
的列为空的原因
FieldName
FieldData
LoadType
Trans
EFFDATE
7/1/2021
NULL
NULL
FACILITYNUMBER
00109
V_HFR_Input_OPRate_LabRad_PHA_R
BPRH
V.NetworkCode_PHA_999
999
V_HFR_Input_OPRate_LabRad_PHA_R
BPRH
V.AccomCode_3
3
V_HFR_Input_OPRate_LabRad_PHA_R
BPRH
V.LAB_PHA_ReimbType
L
V_HFR_Input_OPRate_LabRad_PHA_R
BPRH
V.FFPHA_OPPassThru_LabRad
V_HFR_Input_OPRate_LabRad_PHA_R
BPRH
V.FFPHA_OPLCC_LabRad
0.6555
V_HFR_Input_OPRate_LabRad_PHA_R
BPRH
V.Category
LAB
V_HFR_Input_OPRate_LabRad_PHA_R
BPRH
V.Category
RAD
V_HFR_Input_OPRate_LabRad_PHA_R
BPRH
在处理过程中,我们有一个应用程序通过 OLEDB 连接连接到 Excel 工作簿。原始数据被加载到数据库 table 并触发触发器为字段名称和加载类型添加外键。 table 中的数据如下所示
SeqNo
FileKey
FieldKey
FieldName
FieldData
LoadTypeKey
LoadType
Trans
21
1002
1
EFFDATE
7/1/2021
0
NULL
NULL
97
1002
3
FACILITYNUMBER
00109
16
V_HFR_Input_OPRate_LabRad_PHA_R
BPRH
98
1002
29
V.NetworkCode_PHA_999
999
16
V_HFR_Input_OPRate_LabRad_PHA_R
BPRH
99
1002
6
V.AccomCode_3
3
16
V_HFR_Input_OPRate_LabRad_PHA_R
BPRH
100
1002
27
V.LAB_PHA_ReimbType
L
16
V_HFR_Input_OPRate_LabRad_PHA_R
BPRH
101
1002
17
V.FFPHA_OPPassThru_LabRad
16
V_HFR_Input_OPRate_LabRad_PHA_R
BPRH
102
1002
15
V.FFPHA_OPLCC_LabRad
0.6555
16
V_HFR_Input_OPRate_LabRad_PHA_R
BPRH
103
1002
26
V.Category
LAB
16
V_HFR_Input_OPRate_LabRad_PHA_R
BPRH
104
1002
32
V.Category
RAD
16
V_HFR_Input_OPRate_LabRad_PHA_R
BPRH
我有一个存储过程可以将源数据的行动态地转换为单行,并将字段名称作为列标题,将字段数据作为值。我对这组特定数据的问题是有两个类别,“LAB”和“RAD”。因为 SQL 数据透视表需要聚合函数,所以我只返回一行。如果我使用 PIVOT (MAX(FieldData) FOR FieldName
,我会得到一行“RAD”。如果我使用 PIVOT (MIN(FieldData) FOR FieldName
,我会得到一行“LAB”。
如何制定查询以分别为 LAB 和 RAD 获取一行?所需结果应符合以下条件。
FileKey
SeqNo
LoadTypeKey
FacilityCode
CategoryCode
Network
AccomCode
EffectDate
ReimburseType
PassThruPct
LowerCostChrg
RatioCostChrg
1002
97
16
00109
LAB
999
3
7/1/2021
L
0.6555
NULL
1002
97
16
00109
RAD
999
3
7/1/2021
L
0.6555
NULL
这是一个非常奇怪的枢轴,但您可以为此使用窗口化条件聚合:
SELECT *
FROM (
SELECT
FileKey,
SeqNo,
LoadTypeKey,
FacilityCode = MAX(CASE WHEN FieldName = 'FACILITYNUMBER' THEN FieldData END) OVER (PARTITION BY FileKey),
CategoryCode = FieldData,
Network = MAX(CASE WHEN FieldName = 'V.NetworkCode_PHA_999' THEN FieldData END) OVER (PARTITION BY FileKey),
AccomCode = MAX(CASE WHEN FieldName = 'V.AccomCode_3' THEN FieldData END) OVER (PARTITION BY FileKey),
EffectDate = MAX(CASE WHEN FieldName = 'EFFDATE' THEN FieldData END) OVER (PARTITION BY FileKey),
ReimburseType = MAX(CASE WHEN FieldName = 'V.LAB_PHA_ReimbType' THEN FieldData END) OVER (PARTITION BY FileKey),
PassThruPct = MAX(CASE WHEN FieldName = 'V.FFPHA_OPPassThru_LabRad' THEN FieldData END) OVER (PARTITION BY FileKey),
LowerCostChrg = MAX(CASE WHEN FieldName = 'V.FFPHA_OPLCC_LabRad' THEN FieldData END) OVER (PARTITION BY FileKey)
FROM YourTable t
) t
WHERE FieldName = 'V.Category';
我的数据库是 SQL Server 2016。我们在 Excel 工作簿中接收源数据。包含源数据的工作表有四列。 EFFDATE
对于所有负载类型和 Trans 都是通用的。这就是 EFFDATE
.
FieldName | FieldData | LoadType | Trans |
---|---|---|---|
EFFDATE | 7/1/2021 | NULL | NULL |
FACILITYNUMBER | 00109 | V_HFR_Input_OPRate_LabRad_PHA_R | BPRH |
V.NetworkCode_PHA_999 | 999 | V_HFR_Input_OPRate_LabRad_PHA_R | BPRH |
V.AccomCode_3 | 3 | V_HFR_Input_OPRate_LabRad_PHA_R | BPRH |
V.LAB_PHA_ReimbType | L | V_HFR_Input_OPRate_LabRad_PHA_R | BPRH |
V.FFPHA_OPPassThru_LabRad | V_HFR_Input_OPRate_LabRad_PHA_R | BPRH | |
V.FFPHA_OPLCC_LabRad | 0.6555 | V_HFR_Input_OPRate_LabRad_PHA_R | BPRH |
V.Category | LAB | V_HFR_Input_OPRate_LabRad_PHA_R | BPRH |
V.Category | RAD | V_HFR_Input_OPRate_LabRad_PHA_R | BPRH |
在处理过程中,我们有一个应用程序通过 OLEDB 连接连接到 Excel 工作簿。原始数据被加载到数据库 table 并触发触发器为字段名称和加载类型添加外键。 table 中的数据如下所示
SeqNo | FileKey | FieldKey | FieldName | FieldData | LoadTypeKey | LoadType | Trans |
---|---|---|---|---|---|---|---|
21 | 1002 | 1 | EFFDATE | 7/1/2021 | 0 | NULL | NULL |
97 | 1002 | 3 | FACILITYNUMBER | 00109 | 16 | V_HFR_Input_OPRate_LabRad_PHA_R | BPRH |
98 | 1002 | 29 | V.NetworkCode_PHA_999 | 999 | 16 | V_HFR_Input_OPRate_LabRad_PHA_R | BPRH |
99 | 1002 | 6 | V.AccomCode_3 | 3 | 16 | V_HFR_Input_OPRate_LabRad_PHA_R | BPRH |
100 | 1002 | 27 | V.LAB_PHA_ReimbType | L | 16 | V_HFR_Input_OPRate_LabRad_PHA_R | BPRH |
101 | 1002 | 17 | V.FFPHA_OPPassThru_LabRad | 16 | V_HFR_Input_OPRate_LabRad_PHA_R | BPRH | |
102 | 1002 | 15 | V.FFPHA_OPLCC_LabRad | 0.6555 | 16 | V_HFR_Input_OPRate_LabRad_PHA_R | BPRH |
103 | 1002 | 26 | V.Category | LAB | 16 | V_HFR_Input_OPRate_LabRad_PHA_R | BPRH |
104 | 1002 | 32 | V.Category | RAD | 16 | V_HFR_Input_OPRate_LabRad_PHA_R | BPRH |
我有一个存储过程可以将源数据的行动态地转换为单行,并将字段名称作为列标题,将字段数据作为值。我对这组特定数据的问题是有两个类别,“LAB”和“RAD”。因为 SQL 数据透视表需要聚合函数,所以我只返回一行。如果我使用 PIVOT (MAX(FieldData) FOR FieldName
,我会得到一行“RAD”。如果我使用 PIVOT (MIN(FieldData) FOR FieldName
,我会得到一行“LAB”。
如何制定查询以分别为 LAB 和 RAD 获取一行?所需结果应符合以下条件。
FileKey | SeqNo | LoadTypeKey | FacilityCode | CategoryCode | Network | AccomCode | EffectDate | ReimburseType | PassThruPct | LowerCostChrg | RatioCostChrg |
---|---|---|---|---|---|---|---|---|---|---|---|
1002 | 97 | 16 | 00109 | LAB | 999 | 3 | 7/1/2021 | L | 0.6555 | NULL | |
1002 | 97 | 16 | 00109 | RAD | 999 | 3 | 7/1/2021 | L | 0.6555 | NULL |
这是一个非常奇怪的枢轴,但您可以为此使用窗口化条件聚合:
SELECT *
FROM (
SELECT
FileKey,
SeqNo,
LoadTypeKey,
FacilityCode = MAX(CASE WHEN FieldName = 'FACILITYNUMBER' THEN FieldData END) OVER (PARTITION BY FileKey),
CategoryCode = FieldData,
Network = MAX(CASE WHEN FieldName = 'V.NetworkCode_PHA_999' THEN FieldData END) OVER (PARTITION BY FileKey),
AccomCode = MAX(CASE WHEN FieldName = 'V.AccomCode_3' THEN FieldData END) OVER (PARTITION BY FileKey),
EffectDate = MAX(CASE WHEN FieldName = 'EFFDATE' THEN FieldData END) OVER (PARTITION BY FileKey),
ReimburseType = MAX(CASE WHEN FieldName = 'V.LAB_PHA_ReimbType' THEN FieldData END) OVER (PARTITION BY FileKey),
PassThruPct = MAX(CASE WHEN FieldName = 'V.FFPHA_OPPassThru_LabRad' THEN FieldData END) OVER (PARTITION BY FileKey),
LowerCostChrg = MAX(CASE WHEN FieldName = 'V.FFPHA_OPLCC_LabRad' THEN FieldData END) OVER (PARTITION BY FileKey)
FROM YourTable t
) t
WHERE FieldName = 'V.Category';