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