2017-02-16 4 views
0

У меня есть таблицы «Клиенты» с клиентами деталей и таблицы «ВЫЗОВ», где я храню результат каждого PhoneCallSQL Server 2012 Объединение записей в OUTER APPLY связанный таблицу

Когда мне нужно получить список клиентов Я должен позвонить Я использую этот запрос

SELECT * 
FROM (
    SELECT TOP (50) S.ID,S.URL,S.Phone,S.Email 
    FROM dbo.Customers AS S 
    WHERE URL is not null and City like 'Berl%' 
    ORDER BY S.ID 
    ) AS S 

OUTER APPLY (
SELECT TOP (3) I.CalledOn, I.Answer 
FROM dbo.Calls AS I 
WHERE S.URL = I.URL 
ORDER BY I.CalledOn DESC 
) AS I; 

, где я получаю список всех клиентов в городе вместе с последними 3 ответами.

Но это возвращает до 3 записей для каждого клиента, в то время как я бы только один и суммировать значение 3 значения CalledOn и ответы в той же записи

быть более ясным: Сейчас:

+-----------+---------------+-------------+------------------+ 
|Customer 1 | 555-333 333 | 02-10-17 | Call Tomorrow | 
+-----------+---------------+-------------+------------------+ 
|Customer 2 | 555-444 333 | 02-10-17 | Call Tomorrow | 
+-----------+---------------+-------------+------------------+ 
|Customer 1 | 555-333 333 | 02-11-17 | Call Tomorrow | 
+-----------+---------------+-------------+------------------+ 
|Customer 1 | 555-333 333 | 02-12-17 | Stop Calling  | 
+-----------+---------------+-------------+------------------+ 

Ожидаемое

+-----------+---------------+--------------------------------+ 
|Customer 1 | 555-333 333 | 02-12-17 : Call Stop Calling | 
|   |    | 02-11-17 : Call Tomorrow  | 
|   |    | 02-10-17 : Call Tomorrow  | 
+-----------+---------------+-------------+------------------+ 
|Customer 2 | 555-444 333 | 02-10-17 | Call Tomorrow | 
+-----------+---------------+-------------+------------------+ 

в настоящее время я achieveing ​​это с логикой на стороне сервера, но я уверен, что Ĉ сделать, проще и лучше с TSQL

Можно указать направление?

Благодаря

ответ

1

Для SQL-сервера 2012

SELECT TOP (50) S.ID, S.URL, S.Phone, S.Email, 
      STUFF((SELECT CHAR(10) + concat (I.CalledOn, ' ', I.Answer) 
        FROM dbo.Calls AS I 
        WHERE S.URL = I.URL 
        ORDER BY I.CalledOn DESC 
        FOR XML PATH('') 
       ), 1, 1, '') AS CallAnswer 
FROM dbo.Customers AS S 
WHERE URL is not null and City like 'Berl%' 
ORDER BY S.ID 

vNext:

SELECT TOP (50) S.ID, S.URL, S.Phone, S.Email, 
      (SELECT TOP (3) STRING_AGG(CONCAT(I.CalledOn, ' ', I.Answer), CHAR(13)) 
      FROM dbo.Calls AS I 
      WHERE S.URL = I.URL 
      ORDER BY I.CalledOn DESC 
      ) AS CallAnswer 
FROM dbo.Customers AS S 
WHERE URL is not null and City like 'Berl%' 
ORDER BY S.ID 

Проверьте это здесь: http://rextester.com/HSIEL20631

+0

yessss !! , к сожалению, нужно использовать версию 2012 года .. но это нормально Большое спасибо! – Joe

 Смежные вопросы

  • Нет связанных вопросов^_^