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';