Sql 将多行合并为一行以替换列中的空值

Sql 将多行合并为一行以替换列中的空值,sql,merge,Sql,Merge,如何将多行合并为一行,以便一行中的某些列替换另一行中与其合并的相同列中的空值? 这是一个我所拥有的和我正在努力实现的例子。查询是: SELECT Drug. Name, DefaultVendor.Name, Drug.Strength, Catalog.DIN, Catalog.PackSize, “Vendor1 Price” = CASE WHEN Ven.Name = ‘Vendor1’ THEN Cata

如何将多行合并为一行,以便一行中的某些列替换另一行中与其合并的相同列中的空值? 这是一个我所拥有的和我正在努力实现的例子。查询是:

SELECT  Drug. Name,
        DefaultVendor.Name,
        Drug.Strength,
        Catalog.DIN,
        Catalog.PackSize,
        “Vendor1 Price” = CASE WHEN Ven.Name = ‘Vendor1’ THEN Catalog.Price ELSE NULL END,
        “Vendor1 ItemNum” = CASE WHEN Ven.Name = ‘Vendor1’ THEN Catalog.ItemNum ELSE NULL END,
        “Vendor2 Price” = CASE WHEN Ven.Name = ‘Vendor2’ THEN Catalog.Price ELSE NULL END,
        “Vendor2 ItemNum” = CASE WHEN Ven.Name = ‘Vendor2’ THEN Catalog.ItemNum ELSE NULL END
FROM    Catalog INNER JOIN
        Drug ON Catalog.DIN = Drug.DIN INNER JOIN
        Vendor AS Ven ON Ven.ID = Catalog.VendorID LEFT JOIN
        Vendor AS DefaultVendor ON DefaultVendor.ID = Catalog.DefVendorID OR (DefaultVendor.ID IS NULL)
WHERE   Catalog.Description LIKE ‘Acetaminophen%’
GROUP BY    Ven.Name,
            Drug.Name,
            Drug.Strength,
            Catalog.DIN,
            Catalog.PackSize,
            Catalog.Price,
            Catalog.ItemNum
ORDER BY    Drug.Strength
结果如下所示:

|          Name | DefaultVendor | Strength | DIN | PackSize | Vendor1Price | Vendor1ItemNum | Vendor2Price | Vendor2ItemNum |
|---------------|---------------|----------|-----|----------|--------------|----------------|--------------|----------------|
| Acetaminophen |       Vendor1 |    325mg |   1 |      100 |            5 |           1234 |       (null) |         (null) |
| Acetaminophen |       Vendor1 |    325mg |   1 |      200 |            9 |           1235 |       (null) |         (null) |
| Acetaminophen |       Vendor1 |    325mg |   1 |      100 |       (null) |         (null) |         5.25 |           1111 |
| Acetaminophen |       Vendor1 |    325mg |   1 |      200 |       (null) |         (null) |           10 |           1122 |
| Acetaminophen |       Vendor1 |    500mg |   2 |      100 |            7 |           1236 |       (null) |         (null) |
| Acetaminophen |       Vendor1 |    500mg |   2 |      200 |           13 |           1237 |       (null) |         (null) |
| Acetaminophen |       Vendor1 |    500mg |   2 |      100 |       (null) |         (null) |          7.5 |           1133 |
| Acetaminophen |       Vendor1 |    500mg |   2 |      200 |       (null) |         (null) |           14 |           1144 |
所以我知道数据就在那里。我想做的是将具有相同强度和packsize的行组合在一起,这样一行将显示来自两个供应商的价格和项目编号。以下是我正在寻找的结果:

|          Name | DefaultVendor | Strength | DIN | PackSize | Vendor1Price | Vendor1ItemNum | Vendor2Price | Vendor2ItemNum |
|---------------|---------------|----------|-----|----------|--------------|----------------|--------------|----------------|
| Acetaminophen |       Vendor1 |    325mg |   1 |      100 |            5 |           1234 |       (null) |         (null) |
| Acetaminophen |       Vendor1 |    325mg |   1 |      200 |            9 |           1235 |       (null) |         (null) |
| Acetaminophen |       Vendor1 |    325mg |   1 |      100 |       (null) |         (null) |         5.25 |           1111 |

我想你差不多猜对了

只需在每个字段中添加
MAX()

“Vendor1 Price” = MAX(CASE WHEN Ven.Name = ‘Vendor1’ THEN Catalog.Price END),
“Vendor1 ItemNum” = MAX(CASE WHEN Ven.Name = ‘Vendor1’ THEN Catalog.ItemNum END),
“Vendor2 Price” = MAX(CASE WHEN Ven.Name = ‘Vendor2’ THEN Catalog.Price END),
“Vendor2 ItemNum” = MAX(CASE WHEN Ven.Name = ‘Vendor2’ THEN Catalog.ItemNum END)
如果
案例
未找到匹配项,则默认情况下也不需要包含
否则为NULL
,将返回
NULL

这应该可以做到:

SELECT  Drug. Name,
        DefaultVendor.Name,
        Drug.Strength,
        Catalog.DIN,
        Catalog.PackSize,
        'Vendor1 Price' = SUM(CASE WHEN Ven.Name = 'Vendor1' THEN Catalog.Price  END),
        'Vendor1 ItemNum' = SUM(CASE WHEN Ven.Name = 'Vendor1' THEN Catalog.ItemNum  END),
        'Vendor2 Price' = SUM(CASE WHEN Ven.Name = 'Vendor2' THEN Catalog.Price  END),
        'Vendor2 ItemNum' = SUM(CASE WHEN Ven.Name = 'Vendor2' THEN Catalog.ItemNum  END)
FROM    Catalog INNER JOIN
        Drug ON Catalog.DIN = Drug.DIN INNER JOIN
        Vendor AS Ven ON Ven.ID = Catalog.VendorID LEFT JOIN
        Vendor AS DefaultVendor ON DefaultVendor.ID = Catalog.DefVendorID OR (DefaultVendor.ID IS NULL)
WHERE   Catalog.Description LIKE 'Acetaminophen%'
GROUP BY    Ven.Name,
            Drug.Name,
            Drug.Strength,
            Catalog.DIN,
            Catalog.PackSize,
            Catalog.Price,
            Catalog.ItemNum
ORDER BY    Drug.Strength

您必须解释合并逻辑。还应尝试将数据作为文本包含,因为我们无法从图片中复制/粘贴。请阅读,这里是一个学习如何提高问题质量和获得更好答案的好地方。使用control-k将文本格式化为代码我添加了纯文本数据,而不是照片,但它实际上无法读取,因为它不是正确的“表格”格式,而且看起来我无法使用HTML表格以这种方式格式化数据。编辑:Ctrl-K技巧奏效了。我在这些列中添加了MAX并删除了“ELSE NULL”,但我仍然得到了完全相同的结果。经过一些尝试,我得到了它。我忘了在添加MAX函数后,我必须从GROUPBY子句中删除Price和ItemNum。很高兴您解决了这个问题。记住投票。下次您也可以在这里使用此工具时,您可以加载模式,并使用按钮
TEXT TO DDL
轻松设置示例数据库,这样也可以使您的表成为不起作用的表。我得到了相同数量的行,但由于SUM函数,价格和项目编号不准确。