0

I have a Table "Customers" with customers details and Table "CALLS" where I store the result of each phonecall

When I need to get a list of the customers I have to call I use this query

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;

where I get the list of all customer in the city together with last 3 answers.

But this returns up to 3 records for each customer, while I would have only one and summarize the value 3 values of CalledOn and Answer into the same record

to be more clear: Now:

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

Expected

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

Currently I'm achieveing this with server-side logic, but I'm sure it can be done, easier and in a better way with TSQL

Can suggest the direction?

Thanks

Joe
  • 1,033
  • 1
  • 16
  • 39

1 Answers1

1

For SQL-Server 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 

Check it here: http://rextester.com/HSIEL20631

McNets
  • 10,352
  • 3
  • 32
  • 61