Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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联接乘法_Sql_Sql Server_Join - Fatal编程技术网

字段的SQL联接乘法

字段的SQL联接乘法,sql,sql-server,join,Sql,Sql Server,Join,我有3个带有varios数据集的表。 其中一个表与所有其他表一样具有更多字段 我必须加入SQL reporting services。但问题是,如果我加入这些值,我会得到以下结果: TABLE 1 TABLE 2 |ID| |ID|Calls| |--| |--|-----| | 1| | 2| 7| | 2| | 3| 8| | 3| | 4| 9| 使用左外连接: |ID

我有3个带有varios数据集的表。 其中一个表与所有其他表一样具有更多字段

我必须加入SQL reporting services。但问题是,如果我加入这些值,我会得到以下结果:

TABLE 1       TABLE 2
|ID|          |ID|Calls|
|--|          |--|-----|
| 1|          | 2|    7|
| 2|          | 3|    8|
| 3|          | 4|    9|
使用左外连接:

|ID|Calls|
|--|-----|
| 1|    7|
| 2|    8|
| 3|    9|
第三张表:

|ID|DNIS|Calls|
|--|----|-----|
| 1|4711|    2|
| 1|4712|    3|
| 1|4713|    2|
| 2|4714|    2|
| 2|4715|    3|
| 2|4716|    3|
| 3|4717|    4|
| 3|4718|    3|
| 3|4719|    2|
连同全联接

|ID|Calls|DNIS|Calls|
|--|-----|----|-----|
| 1|    7|4711|    2|
| 1|    7|4712|    3|
| 1|    7|4713|    2|
| 2|    8|4714|    2|
| 2|    8|4715|    3|
| 2|    8|4716|    3|
| 3|    9|4717|    4|
| 3|    9|4718|    3|
| 3|    9|4719|    2|
问题是字段调用的多路复用。报告中的金额都是原来的3倍。这个结构是完全动态的,不能捕获硬编码的。所以我在寻找一种可能性。我需要的是这样的东西

|ID|Calls|DNIS|Calls|
|--|-----|----|-----|
| 1|    7|4711|    2|
| 1| NULL|4712|    3|
| 1| NULL|4713|    2|
| 2|    8|4714|    2|
| 2| NULL|4715|    3|
| 2| NULL|4716|    3|
| 3|    9|4717|    4|
| 3| NULL|4718|    3|
| 3| NULL|4719|    2|
你有什么想法吗

我的testquery如下所示 声明@t1表( id INT )


如果希望查询为
调用
返回空值,但不包括具有给定ID的第一行,可以执行以下操作:

  -- Column names must be unique.  You have two columns for Calls, so I'm 
  -- renaming them here as Calls1 and Calls2.
  ;
  WITH data1 AS (
     select  ID
             Calls1
          ,  DNIS
          ,  Calls2
     from [your query]
  )
  ,  data2 as (
     select *
        ,   RowNumber = ROW_NUMBER() OVER (PARTITION BY ID ORDER BY DNIS) 
     from   data1
 )
 select  ID
    ,    Calls = CASE WHEN RowNumber = 1 THEN Calls1 ELSE Null END
    ,    DNIS
    ,    Calls2
 from    data2   

如果希望查询为
调用
返回空值,但不包括具有给定ID的第一行,可以执行以下操作:

  -- Column names must be unique.  You have two columns for Calls, so I'm 
  -- renaming them here as Calls1 and Calls2.
  ;
  WITH data1 AS (
     select  ID
             Calls1
          ,  DNIS
          ,  Calls2
     from [your query]
  )
  ,  data2 as (
     select *
        ,   RowNumber = ROW_NUMBER() OVER (PARTITION BY ID ORDER BY DNIS) 
     from   data1
 )
 select  ID
    ,    Calls = CASE WHEN RowNumber = 1 THEN Calls1 ELSE Null END
    ,    DNIS
    ,    Calls2
 from    data2   

不需要使用两个CTE

SELECT 
        T1.id,
        CASE 
            WHEN ROW_NUMBER() OVER (PARTITION BY T1.ID ORDER BY T3.DNIS)= 1 THEN T2.calls 
            ELSE NULL 
        END AS Calls
    ,   T3.DNIS
    ,   T3.cnt

FROM @t1 T1
     FULL JOIN @t3 T3 ON T3.id = T1.id
     LEFT JOIN @t2 T2 ON T2.id = T1.id

不需要使用两个CTE

SELECT 
        T1.id,
        CASE 
            WHEN ROW_NUMBER() OVER (PARTITION BY T1.ID ORDER BY T3.DNIS)= 1 THEN T2.calls 
            ELSE NULL 
        END AS Calls
    ,   T3.DNIS
    ,   T3.cnt

FROM @t1 T1
     FULL JOIN @t3 T3 ON T3.id = T1.id
     LEFT JOIN @t2 T2 ON T2.id = T1.id

不,不幸的是,我并不总是有四种元素。它完全是动态的。我正在测试Textbox属性now@Frank我添加了另一个建议,这次是针对底层查询。嗯,看起来像。但id并不总是1。id可以是介于1和9999999之间的所有内容。@Frank实际上,我刚刚意识到我遗漏了
分区
子句。但在任何情况下,我都不是在测试值1的ID,而是在测试我创建的列RowNumber。@Frank
Row\u Number()
函数为每一行分配一个数字,并使用ID的每个新值重新启动(这就是
分区
子句所做的)然后在相同的ID值内,用DNIS按升序分配它们。因此,每个ID值的第一行的RowNumber值为1。不,不幸的是,我并不总是有四个元素。它完全是动态的。我正在测试Textbox属性now@Frank我添加了另一个建议,这次是针对底层查询。嗯,看起来像。但id并不总是1。id可以是介于1和9999999之间的所有内容。@Frank实际上,我刚刚意识到我遗漏了
分区
子句。但在任何情况下,我都不是在测试值1的ID,而是在测试我创建的列RowNumber。@Frank
Row\u Number()
函数为每一行分配一个数字,并使用ID的每个新值重新启动(这就是
分区
子句所做的)并在相同的ID值内通过DNI按升序分配它们。因此,每个ID值的第一行的RowNumber值为1。大多数人通过在单独的查询/子查询中汇总结果来避免这种情况。所需数据的最终形式是什么?实际上是带有null的表,还是您打算进一步汇总它?不,带有null的表是我报告的最终结果。大多数人通过在单独的查询/子查询中汇总结果来避免这种情况。所需数据的最终形式是什么?它实际上是带有空值的表,还是您打算进一步汇总它?不,带有空值的表是我报告的最终结果。