2016-02-24 50 views
0

如何将多行组合到一行中,以便一行中的某些列替换与其合并的另一行中相同列中的空值? 下面是我有什么和我想要实现的例子。查询是:将多行组合成一行以替换列中的空值

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 | 

所以我知道数据是存在的。我想要做的就是将具有相同强度的行和打包大小相结合,以便单行显示来自两个供应商的价格和物料编号。以下是我正在寻找的结果:

|   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 | 
+0

你有解释你的合并逻辑。也尝试将数据包含为文本,因为我们无法从图片复制/粘贴。 \t请阅读[**如何提问**](http://stackoverflow.com/help/how-to-ask) \t \t这里是[** START **]( http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/)了解如何提高您的问题质量并获得更好的答案。 –

+0

使用control-k将文本格式设置为代码 –

+0

我使用纯文本而不是照片添加了数据,但它几乎不可读,因为它没有以适当的“表”格式显示,而且看起来我无法使用HTML表格以这种方式格式化数据。编辑:Ctrl-K技巧工作。 –

回答

1

我想你几乎说得没错。

只需添加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) 

也不需要在默认情况下包括ELSE NULL如果CASE犯规找到匹配将返回NULL

+0

我将MAX添加到这些列,并删除了“ELSE NULL”,但我仍然得到完全相同的结果 –

+0

经过一番玩,我明白了。我忘了必须在添加MAX函数后从group by子句中删除Price和ItemNum。 –

+1

很高兴你解决它。记住upvote。下一次你也可以使用这个工具http://sqlfiddle.com/#!15/36069/1在这里你可以加载你的模式并使用按钮“文本到DDL”来轻松设置一个样本分贝 –

0

这应做到:

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 
+0

这是行不通的。由于SUM函数,我得到的行数相同,但价格和项目数量不准确。 –