如何编写查询以针对两个不同条件返回两个不同的列?

问题描述

我有一个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