[英]SQL JOIN multiplication of a field
我有3個帶有varios數據集的表。 這些表之一具有與其他所有表一樣的更多字段。
我必須加入SQL報表服務。 但是問題是,如果我加入值,則會得到以下結果:
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|
與FULL JOIN一起
|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看起來像這樣DECLARE @ t1 TABLE(id INT)
INSERT INTO @t1 SELECT 1
INSERT INTO @t1 SELECT 2
INSERT INTO @t1 SELECT 3
SELECT * FROM @t1
DECLARE @t2 TABLE (
id INT
,calls INT
)
INSERT INTO @t2 SELECT 1,3
INSERT INTO @t2 SELECT 2,4
INSERT INTO @t2 SELECT 3,5
DECLARE @t3 TABLE (
id INT
,DNIS INT
,cnt INT
)
INSERT INTO @t3 SELECT 1,1,3
INSERT INTO @t3 SELECT 1,2,4
INSERT INTO @t3 SELECT 1,3,5
INSERT INTO @t3 SELECT 2,1,3
INSERT INTO @t3 SELECT 2,2,4
INSERT INTO @t3 SELECT 2,3,5
INSERT INTO @t3 SELECT 3,1,3
INSERT INTO @t3 SELECT 3,2,4
INSERT INTO @t3 SELECT 3,3,5
SELECT
t1.id
,t2.calls
,t3.DNIS
,t3.CNT
FROM
@t1 as t1
FULL JOIN
@t3 as t3
on t1.id = t3.id
LEFT OUTER JOIN
@t2 as t2
on t1.id = t2.id
如果您希望查詢返回除具有給定ID的第一行以外的所有Calls
null,則可以執行以下操作:
-- 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.