簡體   English   中英

SQL JOIN字段的乘法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM