2016-06-08 4 views
0

Я вставляю данные в таблицу пользователя из таблицы журнала запросов. В таблице журнала запросов пользовательский псевдоним появляется каждый раз, когда выполняется запрос. В таблице «Пользователи» я хочу, чтобы столбец «Пользовательский псевдоним» имел псевдоним пользователя для каждой комбинации даты и имени предприятия, который применяется к псевдониму, без повторяющихся строк. Причина, в которой я нуждаюсь в этом, заключается в том, что я создаю визуальное представление, которое должно отражать различное количество пользователей, которые выполнили запрос для каждого бизнеса, по годам. Мне также нужна способность обрезать псевдоним, бизнес и дату. Моя цель состоит в том, чтобы результат выглядел так.Не удалось написать инструкцию выбора, которая возвращает 1 строку за каждый год, когда псевдоним пользователя появляется в журнале запросов.

User Alias LOB    Date 
Joe   Business 1   2015-01-01 
Joe   Business 1   2016-01-01 
Carol   Business 1   2015-01-01 
Carol   Business 1   2016-01-01 

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

User Alias LOB    Date 
Joe   Business 1   2015-01-01 
Carol   Business 1   2015-01-01 

Я знаю, что инструкция DISTINCT должна быть выполнена, но после этого я застрял.

INSERT INTO [DBO].[USERS] ([User Alias], [LOB], [Date]) 
SELECT DISTINCT [User Alias], [LOB] , (SELECT TOP 1 [Date] FROM Business) [Date] 
FROM Business [LOG] 
WHERE NOT EXISTS (
    SELECT 1 
    FROM [dbo].[Users] [DIM] 
    WHERE [LOG].[User Alias] = [DIM].[User Alias] 
     AND [LOG].[LOB] = [DIM].[LOB] 
     AND [LOG].[Date] = [DIM].[Date] 
    ) 
AND [User Alias] IS NOT NULL 
AND [LOB] IS NOT NULL 
+0

Какова ваша версия sql sever, поддерживает ли она MERGE? – Serg

+0

2016. Он поддерживает объединение – LostInTheSauce

+0

Я должен уточнить, что каждая строка должна отражать пользователя, год и бизнес, которые возникают в запросе, без повторения строки. Пользователь может выполнить до 100 запросов в определенный день. Все, о чем я беспокоюсь, - это если пользователь выполнил один запрос за данный год. – LostInTheSauce

ответ

0

GROUP BY Год (а также псевдонимов и LOB) и выберите MIN (дата) вместо TOP 1 подзапрос.

EDIT: более точный пример того, как реализовать мое предложение -

INSERT INTO [DBO].[USERS] ([User Alias], [LOB], [Date]) 
SELECT [User Alias], [LOB] , MIN([Date]) [Date] 
FROM Business [LOG] 
WHERE NOT EXISTS (
    SELECT 1 
    FROM [dbo].[Users] [DIM] 
    WHERE [LOG].[User Alias] = [DIM].[User Alias] 
     AND [LOG].[LOB] = [DIM].[LOB] 
     AND YEAR([LOG].[Date]) = YEAR([DIM].[Date]) 
    ) 
AND [User Alias] IS NOT NULL 
AND [LOB] IS NOT NULL 
GROUP BY [User Alias], [LOB] , YEAR([Date]) 
+0

Этот подход возвращает повторяющиеся строки – LostInTheSauce

+0

Как вы его реализовали? Если все сделано правильно, часть SELECT не будет возвращать повторяющиеся строки. См. Изменение в моем ответе. –

+0

Также используйте функцию YEAR() в предложении EXISTS(), чтобы избежать дублирования строк, которые уже находятся в таблице. –

0

Это, кажется, сделать трюк.

SELECT distinct [User Alias], [LOB], datepart(yyyy,[Date]) [Date] 
FROM Business [LOG] 
WHERE NOT EXISTS (SELECT 1 FROM [dbo].[Users] [DIM] 
WHERE [LOG].[User Alias] = [DIM].[User Alias] 
and [LOG].[LOB] = [DIM].[LOB] and [LOG].[Date] = [DIM].[Date]) 
and [User Alias] is not null 
and [LOB] is not null 
GROUP BY [DATE], [User Alias], [LOB]