编写select语句时遇到问题,该语句每年返回1行,用户别名出现在查询日志中

时间:2016-06-08 19:17:22

标签: sql sql-server group-by subquery insert-update

我将数据从Query LOG表插入到User表中。在查询日志表中,每次执行查询时都会显示用户别名。在Users表中,我希望User Alias列具有适用于别名的日期和业务名称的每个组合的用户别名,没有重复的行。我需要这个的原因是因为我创建的视觉效果需要反映每年为每个业务执行查询的不同用户数量。我还需要能够根据别名,业务和日期进行切片。我的目标是让结果看起来像..

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

2 个答案:

答案 0 :(得分:0)

GROUP BY Year(以及Alias和LOB)和SELECT MIN(日期)而不是TOP 1子查询。

编辑:如何实施我的建议的更精确的例子 -

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

答案 1 :(得分: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]