在 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
我很少不得不在 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