You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server查询:将一对多关系数据展示在单行中

SQL Server查询:将一对多关系数据展示在单行中

没问题,我来帮你实现这个需求!你要做的是把关联的三张表数据整合,将同一个处方下的多个药品ID横向展示在单行的不同列里,也就是行转列的操作。下面给你两种实用的SQL Server实现方案:

方案一:使用条件聚合(兼容性好,适合所有SQL Server版本)

这种方法通过给每个处方下的药品编号,再配合CASE和聚合函数来实现列转换,非常直观:

SELECT
    p.FirstName,
    p.LastName,
    pr.Id AS PrescriptionId,
    MAX(CASE WHEN rn = 1 THEN mfp.MedicineID END) AS Medicine1,
    MAX(CASE WHEN rn = 2 THEN mfp.MedicineID END) AS Medicine2,
    MAX(CASE WHEN rn = 3 THEN mfp.MedicineID END) AS Medicine3
FROM
    Patient p
JOIN
    Prescription pr ON p.Id = pr.PatientId
JOIN (
    -- 给每个处方下的药品按ID排序并分配序号
    SELECT 
        MedicineID, 
        prescriptionId,
        ROW_NUMBER() OVER (PARTITION BY prescriptionId ORDER BY Id) AS rn
    FROM MedicineForPrescription
) mfp ON pr.Id = mfp.prescriptionId
GROUP BY
    p.FirstName, p.LastName, pr.Id

方案二:使用SQL Server PIVOT运算符(语法更简洁)

如果你的SQL Server版本支持PIVOT(2005及以上),可以用这个更简洁的写法:

SELECT
    p.FirstName,
    p.LastName,
    pr.Id AS PrescriptionId,
    [1] AS Medicine1,
    [2] AS Medicine2,
    [3] AS Medicine3
FROM
    Patient p
JOIN
    Prescription pr ON p.Id = pr.PatientId
JOIN (
    -- 同样先给药品分配序号
    SELECT 
        MedicineID, 
        prescriptionId,
        ROW_NUMBER() OVER (PARTITION BY prescriptionId ORDER BY Id) AS rn
    FROM MedicineForPrescription
) mfp ON pr.Id = mfp.prescriptionId
PIVOT (
    -- 聚合获取对应序号的药品ID
    MAX(MedicineID)
    FOR rn IN ([1], [2], [3]) -- 指定要转换的列值
) AS PivotTable

补充说明

如果你的业务中一个处方下的药品数量不固定(可能超过3种),上面的固定列方案就不适用了,这时候需要写动态SQL来自动生成对应数量的列。不过从你的示例数据来看,固定3列的方案完全能满足需求。

备注:内容来源于stack exchange,提问作者MD SHAFFAT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 10:42:43