问题描述
我有一个Microsoft sql Server表,其中有三列-一列用于 Locations ,一列用于相关的 Images ,另一列指示是否应使用给定的图像用作给定位置的主图像(之所以这样做,是因为历史上每个位置上载了多张图像,并且此列指示一个图像 strong>实际上已被使用)。
现在,我们希望能够为我们的位置选择并分配第二张图片作为徽标,从而增加了第四列以指示哪个图像成为该徽标。
+----------+----------+-----------------+-----------+
| filename | location | IsMainImage | Islogo |
+----------+----------+-----------------+-----------+
| img1 | 10 | True | Null |
| img2 | 10 | Null | True |
| img3 | 10 | Null | Null |
| img4 | 20 | True | Null |
| img5 | 20 | NULL | True |
+----------+----------+-----------------+-----------+
我的目标是编写一个查询,该查询将在查询的同一行中将img1和img2作为不同的列返回,然后将img3和img4返回另一行。从上表中,我需要输出看起来像这样:
+-----------+-------------+
| filename1 | filename2 |
+-----------+-------------+
| img1 | img2 |
| img4 | img5 |
+-----------+-------------+
请注意,我的描述过于简单。我正在修改SSIS程序包,该程序包由我无法修改的另一个进程使用。这就是为什么我需要这种格式的输出的原因。 后来变成Filename1和Filename2的是同一文件(徽标是主图像的调整大小版本),现在我需要区分两者。
至关重要的是,只有标记为IsMainImage的列显示在filename1下,而只有Islogo标记的列显示在filename2下。
对此我将不胜感激。谢谢!
解决方法
使用案例表达:
SELECT max(CASE WHEN [IsMainImage] = 'True' then filename end) as filename1,max(CASE WHEN [IsLogo] = 'True' then filename end) as filename2
from Table_testcase group by location;
,
您可以将表与自身连接起来,如下所示:
SELECT im1.filename as filename1,im2.filename as filename2
FROM images im1
JOIN images im2
ON im1.location = im2.location
AND im2.IsLogo = 1
WHERE im1.IsMainImage = 1