2017-06-15 63 views
1

我很少必须在SQL中使用数据透视表,并且在绕过它时遇到问题。我有询问,为医疗机构制作病人和保险表格。我想要返回显示患者所有保险的单行。在SQL中使用数据透视表t

的样本数据:

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

的目标是显示这样的数据:

enter image description here

我明白枢纽的基本功能,但不具备很多的时间来弄清楚如何实现上述结果。我还没有取得任何与工作结果接近的结果,这可能是缺乏经验或疲劳。任何帮助,将不胜感激。

+0

标签您与您正在使用的数据库的问题。 –

+0

好的。它一定是我正在经历的精神疲劳;) – theeviininja

回答

2

像这样

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 
1

如果你有最多两个值(由你的样本数据和结果的建议),则可以使用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; 
+0

可以有多达4个,但我试图保持示例数据很简单,以了解如何枢轴工作。 – theeviininja

0

这里是你正在找。这将根据需要压扁您的记录。

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

我喜欢有条件聚集在可能的情况:

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是有条件aggregration一个良好的阅读,或交叉表,与PIVOT