Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server,将列中的所有值与另一列的某些值联接_Sql_Sql Server - Fatal编程技术网

SQL Server,将列中的所有值与另一列的某些值联接

SQL Server,将列中的所有值与另一列的某些值联接,sql,sql-server,Sql,Sql Server,我不擅长解释,所以我会尽量让我的例子来做大部分的讨论。假设我有一张这样的桌子: dbo.ExampleTable =================================== ID Year Data1 Data2 ====== ======== ========= ========= 12 2016 FOO BAR 13 2016 FOO MAN 14

我不擅长解释,所以我会尽量让我的例子来做大部分的讨论。假设我有一张这样的桌子:

          dbo.ExampleTable
===================================


  ID     Year     Data1     Data2
====== ======== ========= =========
  12     2016      FOO       BAR
  13     2016      FOO       MAN
  14     2016      SAW       BAR

  20     2017      FOO       BAR
  21     2017      FOO       MAN
  27     2017      SAW       BAR
  29     2017      CHU       CAR

  44     9999      FOO       BAR
  48     9999      FOO       MAN
  51     9999      SAW       BAR
  52     9999      CHU       CAR
一些注意事项:

  • ID是唯一的
  • (年份,数据1,数据2)是唯一的
  • 年份栏中的唯一值为2016、2017或9999
我想从该数据创建一个如下所示的表:

  ID_9999     ID_2016     ID_2017  
=========== =========== ===========
     44          12          20
     48          13          21
     51          14          27
     52         NULL         29
  ID_9999     ID_2016     ID_2017  
=========== =========== ===========
     44          12          20
     48          13          21
     51          14          27
因此,本质上,对于年份=9999的每个数据1和数据2的唯一配对,我想创建一行,其中包含年份=9999的配对ID,以及年份=2016和年份=2017的配对ID。此外,如果2016年或2017年不包含该数据对,我希望它们的值为NULL

这是我到目前为止得到的问题:

SELECT      tbl9999.ID       ID_9999,
            tbl2016.ID       ID_2016,
            tbl2017.ID       ID_2017

FROM        dbo.ExampleTable tbl9999

LEFT JOIN   dbo.ExampleTable tbl2016
ON          tbl9999.Data1 = tbl2016.Data1
AND         tbl9999.Data2 = tbl2016.Data2

LEFT JOIN   dbo.ExampleTable tbl2017
ON          tbl9999.Data1 = tbl2017.Data1
AND         tbl9999.Data2 = tbl2017.Data2

WHERE       tbl9999.Year=9999
AND         tbl2016.Year=2016
AND         tbl2017.Year=2017
这似乎工作得很好,但它将生成如下表:

  ID_9999     ID_2016     ID_2017  
=========== =========== ===========
     44          12          20
     48          13          21
     51          14          27
     52         NULL         29
  ID_9999     ID_2016     ID_2017  
=========== =========== ===========
     44          12          20
     48          13          21
     51          14          27
*请注意,在我上面的示例中,它缺少具有null值的行。有没有办法将我的查询更改为包含该空值,以便在我的示例中使用它

如果我遗漏了任何信息或需要澄清,请告诉我。提前谢谢

编辑: 我能自己找到答案!这是我用来实现预期结果的代码:

SELECT      [9999] [ID_9999],
            [2016] [ID_2016],
            [2017] [ID_2017]
FROM        dbo.ExampleTable
PIVOT       (MAX([ID]) FOR [Year] IN ([2016],[2017],[9999])) [x]
ORDER BY    ID_9999

您可以通过多种方式来实现这一点。条件聚合似乎足够简单:

select max(case when year = 2016 then id end) as id_2016,
       max(case when year = 2017 then id end) as id_2017,
       max(case when year = 9999 then id end) as id_9999

from (select t.*, row_number() over (partition by year order by id) as seqnum
      from dbo.ExampleTable t
     ) t
group by seqnum
order by seqnum;

将where子句移动到联接。。。i、 e.
LEFT JOIN dbo.example tbl2016 on。。。。tbl2016.Year=2016
这与我想要的非常接近,但是当我与我的数据集进行比较时,结果有点不一致。它似乎生成了正确数量的结果,但是,ID对我来说并不匹配。它似乎将三年中最低的ID分组为一行,然后在下一行中每三年中的下一个最低ID,依此类推。我应该提到的是,我的数据集并不像我的示例中那样是迭代的。虽然ID是唯一的,但它不是有序的,年份和ID分散在我的数据集中。这会影响你的答案吗?@JonWarren。ID应该以数字顺序显示,与示例数据中的显示方式完全相同。只要
id
是唯一的,就会产生相同的答案。