2014-02-20 3 views
1

У меня есть 3 таблицы с наборами данных varios. В одной из этих таблиц больше полей, как и все остальные.SQL JOIN умножение поля

Мне нужно присоединиться к нему для служб отчетов SQL. Но проблема в том, что если я присоединиться к ценности, я получаю следующий результат:

TABLE 1  TABLE 2 
|ID|   |ID|Calls| 
|--|   |--|-----| 
| 1|   | 2| 7| 
| 2|   | 3| 8| 
| 3|   | 4| 9| 

С LEFT OUTER JOIN:

|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| 

Thr Проблема заключается в том, что мы называем взаимозависимым полем «Звонки». Суммы в отчете все в 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 ( идентификатор 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 
+2

где запрос? – Asdfg

+0

Большинство людей избегают этого, сворачивая результаты в отдельных запросах/подзапросах. Какова конечная форма желаемых данных - действительно ли это таблица с нулями, или вы планируете ее ускорить? –

+0

Нет, эта таблица с нулями является окончательным результатом для моего отчета. – Frank

ответ

3

Если вы хотите, чтобы ваш запрос вернуться аннулирует для Calls все, кроме первой строки с заданным идентификатором, вы могли бы сделать что-то вроде этого:

-- 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 
+0

no, unfortunaltely У меня не всегда четыре элемента. Он полностью динамичен. Я тестирую свойство Textbox только сейчас – Frank

+0

hideDuplicates не будет работать :-( – Frank

+0

@Frank Я добавил еще одно предложение, на этот раз для основного запроса. –

1

С, используя два 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