在 SQL t 中使用 Pivot

Using Pivot in SQL t

我很少不得不在 SQL 中使用 pivot,而且我很难理解它。我有查询生成 table 的患者和医疗机构的保险。我想要 return 一行显示患者拥有的所有保险。

示例数据:

ID  Insurance
1840    Medicaid Of New York
1841    Affinity Health Plan
1841    Medicaid Of New York
1842    Fidelis Care
1842    Medicaid Of New York

目标是像这样显示数据:

我了解 pivot 的基本功能,但没有太多时间弄清楚如何实现上述结果。我还没有取得任何接近工作成果的成果,这可能是缺乏经验或此时疲劳。任何帮助将不胜感激。

如果您最多有两个值(如您的示例数据和结果所建议的那样),您可以使用 min()max():

select id,
       min(insurance) as insurance1,
       (case when min(insurance) <> max(insurance) then max(insurance)
        end) as insurance2
from t
group by id;

像这样

with data as (
select id,insurance ,row_number() over ( partition by id order by insurance) rowid 
)


select d.id , [1] as ins1,[2] ins2,[3]ins3,[4] ins4
from data d
pivot 
(max(insurance) 
for rowid in ([1],[2],[3],[4])
)pv

这就是您要查找的内容。这将根据需要展平您的记录。

SELECT 
    ID, Insurance1, Insurance2, Insurance3, Insurance4
FROM (  SELECT 
            ID, 
            Insurance,
            RN = 'Insurance' + 
            CAST(ROW_NUMBER() OVER(PARTITION BY ID ORDER BY Insurance) AS CHAR(1))
        FROM MyDB.MySchema.MyTable
) AS d
PIVOT(
    MAX(Insurance) 
        for RN 
            in (Insurance1, Insurance2, Insurance3, Insurance4)
) AS p;

我更喜欢条件聚合:

SELECT  ID,
        MAX(CASE WHEN RN = 1 THEN INSURANCE ELSE '' END) AS INSURANCE1,
        MAX(CASE WHEN RN = 2 THEN INSURANCE ELSE '' END) AS INSURANCE2,
        MAX(CASE WHEN RN = 3 THEN INSURANCE ELSE '' END) AS INSURANCE3,
        MAX(CASE WHEN RN = 4 THEN INSURANCE ELSE '' END) AS INSURANCE4
FROM (
      SELECT  ID,
              INSURANCE,
              ROW_NUMBER() OVER (PARTITION BY ID ORDER BY INSURANCE) RN
      FROM YourTable
     ) A
GROUP BY ID

This 是关于条件聚合或交叉表的好读物,而不是 PIVOT