SQL Server 2008 присоединиться при условии - PullRequest
0 голосов
/ 01 ноября 2011

У меня есть таблица, где у меня есть несколько отправленных sms'ов операторами, а некоторые пользователями, в обоих случаях в столбце PhoneNumber указан телефон пользователя

{PhoneNumber Date Type SMS Response}

Typeравно 1 или 2, когда значение равно 1, сообщение отправляется оператором, когда значение равно 2, сообщение отправляется пользователем.В первом случае заполнен ответ, во втором - SMS.

Мне нужно показать сообщения, отправленные операторами, и ответы пользователей.

Если это пример (отсортированный по времени):

user message 1
user message 2
operators message 1
operators message 2
operators message 3
users message 3
users message 4

, он должен быть отсортирован так:

operators message 1   null
operators message 2   null
operators message 3  users message 3 users message 4

(я "выбрал только" строку с сообщениями)

так что это моя идея, разделить сообщения пользователей и операторов в две временные таблицы и оставить их присоединенными к ним по PhoneNumber = PhoneNumber, но я не знаю, чтобы выполнить эти временные условия.

В основномлюбые решения, в которых будут перечислены сообщения операторов и ответы (которые должны определяться временем, если сообщения трех операторов в строке, а затем сообщение пользователя, его ответ на третьем и для первых двух ответов должен быть нулевым, а сообщения пользователей перед первым сообщением операторовне важно).

Я сделал все возможное, чтобы объяснить, если у вас есть вопросы, пожалуйста, задавайте, и заранее спасибо за любые идеи.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2011

Это должно работать в t-SQL :

CREATE table #msg(id integer, type integer, msg nvarchar(max), ts datetime)

INSERT INTO #msg VALUES (1, 2, 'user msg 1',     '2011-11-01 16:00')
INSERT INTO #msg VALUES (2, 2, 'user msg 2',     '2011-11-01 16:01')
INSERT INTO #msg VALUES (3, 1, 'operator msg 1', '2011-11-01 16:02')
INSERT INTO #msg VALUES (4, 1, 'operator msg 2', '2011-11-01 16:03')
INSERT INTO #msg VALUES (5, 1, 'operator msg 3', '2011-11-01 16:04')
INSERT INTO #msg VALUES (6, 2, 'user msg 3',     '2011-11-01 16:05')
INSERT INTO #msg VALUES (7, 2, 'user msg 4',     '2011-11-01 16:06')

;WITH
   o AS (
  SELECT id, ts, msg
  FROM   #msg
  WHERE  type = 1
  )
  ,u AS (
  SELECT id, ts, msg, (SELECT TOP 1 id FROM o
                       WHERE  o.ts <= x.ts ORDER BY ts DESC) AS o_id
  FROM   #msg x
  WHERE  type = 2
  )
SELECT o.msg, (SELECT u.msg + ',' FROM u WHERE  u.o_id = o.id
               ORDER  BY u.ts, u.id FOR XML PATH('')) AS u_msg
FROM   o
ORDER  BY o.ts

См. Демоверсию на data.stackexchange.com

Основные баллы:

  • Используйте CTE для разделения пользовательских сообщений и присваивайте предыдущее сообщение оператора каждому.
  • GROUP BY сообщение оператора на последнем шаге.
  • Используйте FOR XML для замены отсутствующей функции агрегирования.
    Этот связанный ответ был полезен: Конкатенация значений строк T-SQL
0 голосов
/ 01 ноября 2011

Почему бы вам не добавить в таблицу столбец, который можно использовать в качестве справочного столбца, как показано в примере ниже:

CREATE TABLE #temp
(
    SmsId           INT,
    PhoneNumber     VARCHAR(100),
    SMS             VARCHAR(200),
    IsUserResponse  BIT,
    DateReceived    DATETIME,
    LinkTo          INT 
)
INSERT INTO #temp VALUES(1,'0300','sms from operator', 0, GETDATE(), NULL)
INSERT INTO #temp VALUES(2,'0300','sms from operator', 0, GETDATE(), NULL)
INSERT INTO #temp VALUES(3,'0301','sms from operator', 0, GETDATE(), NULL)
INSERT INTO #temp VALUES(4,'0300','sms from Customerr', 1, GETDATE(), 2)
INSERT INTO #temp VALUES(3,'0301','sms from Customer', 1, GETDATE(), 3)

SELECT  * INTO #CustomerSms FROM    #temp WHERE IsUserResponse = 0
SELECT  * INTO #OperatorSms FROM    #temp WHERE IsUserResponse = 1


SELECT  * 
FROM    #CustomerSms c
        FULL JOIN #OperatorSms o ON c.SmsId = o.LinkTo

DROP TABLE #temp
DROP TABLE #CustomerSms
DROP TABLE #OperatorSms

Надеюсь, его очистить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...