2016-11-03 66 views
0

我有第一个需要的查询运行。该查询按周将用户的活动级别聚合到相应的BusinessIds中。需要帮助将第二个查询合并到第一个查询中

为了便于报告,我需要创建一个新列,以捕获每个分组周和BusinessId具有大于0的活动级别的UserIds的数量。第二个查询为我提供了正确的值(尽管它可能比合并后需要的数据点多),但我很难将它合并到我的第一个查询中。

这可能是一个非常直接的努力,但我一直无法从其他问题的样本中找出它。任何帮助表示赞赏。

/* First Query */ 
SET DATEFIRST 2; 
SELECT 
    SUM(
     fua.[RisksAffected] 
     +fua.[IssuesAffected] 
     +fua.[ChangesAffected]) AS RIC 
    ,SUM(
     fua.[ProjectsCreated] 
     +fua.[ProjectsAffected]) AS Projects 
    ,CASE 
     WHEN SUM(fua.[ProjectsCreated]) >0 
      THEN CAST(1 AS BIT) 
      ELSE CAST(0 AS BIT) 
      END AS ProjectCreated 
    ,SUM(fua.[TimesheetsCreated]) AS Timesheets 
    ,SUM(fua.[ReportsAffected]) AS Reports 
    ,SUM(fua.[FilesAffected]) AS Files 
    ,ud.[BusinessId] 
    ,COUNT (DISTINCT fua.UserId) AS [UserCount] 
    ,DateAdd(day, -1 * datepart(dw,fua.[QueryDate]),fua.[QueryDate]) AS [ActivityDate] 

FROM [client_projectmanager].[whs].[FactUserActivity] fua 
    Left Join [client_projectmanager].[whs].[DimUserDataV2] ud 
     ON 
    fua.[UserId] = ud.[UserId] 

GROUP BY 
    DateAdd(day, -1 * datepart(dw,fua.[QueryDate]),fua.[QueryDate]),ud.[BusinessId] 


/* Second Query */ 
SET DATEFIRST 2; 
SELECT 
     count (distinct sela.UserId) 
     ,sela.BusinessId 
     ,DateAdd(day, -1 * datepart(dw,sela.[Date]),sela.Date) 
FROM 
    (SELECT 
     fua.UserId 
     ,ud.BusinessId 
     ,DateAdd(day, -1 * datepart(dw,fua.[QueryDate]),fua.[QueryDate]) AS [Date] 
     ,SUM(
      fua.[RisksAffected] 
      +fua.[IssuesAffected] 
      +fua.[ChangesAffected] 
      +fua.[ProjectsCreated] 
      +[ProjectsAffected]) AS Acttotal 

FROM [client_projectmanager].[whs].[FactUserActivity] fua 
     Left Join [client_projectmanager].[whs].[DimUserDataV2] ud 
     ON 
     fua.[UserId] = ud.[UserId] 

GROUP BY 
     DateAdd(day, -1 * datepart(dw,fua.[QueryDate]),fua.[QueryDate]) 
     ,fua.[UserId] 
     ,ud.BusinessId 

HAVING 
     SUM(fua.[RisksAffected] 
      +fua.[IssuesAffected] 
      +fua.[ChangesAffected] 
      +fua.[ProjectsCreated] 
      +fua.[ProjectsAffected]) 
      >0) sela 

GROUP BY 
     DateAdd(day, -1 * datepart(dw,sela.[Date]),sela.Date) 
     ,sela.BusinessId 
     ORDER BY DateAdd(day, -1 * datepart(dw,sela.[Date]),sela.Date) 

回答

0

如果要在一个语句中执行此操作,则可以使用CTE。

SET DATEFIRST 2; 
WITH cte1 AS (
    /* First Query */ 
    SELECT SUM(fua.[RisksAffected] + fua.[IssuesAffected] + fua.[ChangesAffected]) AS RIC, 
      SUM(fua.[ProjectsCreated] + fua.[ProjectsAffected]) AS Projects, 
      CASE WHEN SUM(fua.[ProjectsCreated]) > 0 THEN CAST(1 AS BIT) 
       ELSE CAST(0 AS BIT) 
      END AS ProjectCreated, 
      SUM(fua.[TimesheetsCreated]) AS Timesheets, 
      SUM(fua.[ReportsAffected]) AS Reports, 
      SUM(fua.[FilesAffected]) AS Files, 
      ud.[BusinessId], 
      COUNT(DISTINCT fua.UserId) AS [UserCount], 
      DATEADD(day,-1 * DATEPART(dw,fua.[QueryDate]),fua.[QueryDate]) AS [ActivityDate] 
    FROM [client_projectmanager].[whs].[FactUserActivity] fua 
      LEFT JOIN [client_projectmanager].[whs].[DimUserDataV2] ud ON fua.[UserId] = ud.[UserId] 
    GROUP BY DATEADD(day,-1 * DATEPART(dw,fua.[QueryDate]),fua.[QueryDate]), 
      ud.[BusinessId] 
), 
cte2 AS (
    /* Second Query */ 
    SELECT COUNT(DISTINCT sela.UserId), 
      sela.BusinessId, 
      DATEADD(day,-1 * DATEPART(dw,sela.[Date]),sela.Date) 
    FROM (SELECT fua.UserId, 
        ud.BusinessId, 
        DATEADD(day,-1 * DATEPART(dw,fua.[QueryDate]),fua.[QueryDate]) AS [Date], 
        SUM(fua.[RisksAffected] + fua.[IssuesAffected] + fua.[ChangesAffected] + fua.[ProjectsCreated] + [ProjectsAffected]) AS Acttotal 
      FROM [client_projectmanager].[whs].[FactUserActivity] fua 
        LEFT JOIN [client_projectmanager].[whs].[DimUserDataV2] ud ON fua.[UserId] = ud.[UserId] 
      GROUP BY DATEADD(day,-1 * DATEPART(dw,fua.[QueryDate]),fua.[QueryDate]), 
        fua.[UserId], 
        ud.BusinessId 
      HAVING SUM(fua.[RisksAffected] + fua.[IssuesAffected] + fua.[ChangesAffected] + fua.[ProjectsCreated] + fua.[ProjectsAffected]) > 0 
      ) sela 
    GROUP BY DATEADD(day,-1 * DATEPART(dw,sela.[Date]),sela.Date), 
      sela.BusinessId 
    ORDER BY DATEADD(day,-1 * DATEPART(dw,sela.[Date]),sela.Date) 
) 
SELECT * 
FROM cte1 
     -- USE INNER JOIN IF YOU WANT ONLY RECORDS THAT EXIST IN BOTH 
     LEFT JOIN cte2 ON cte1.BusinessId = cte2.BusinessId 
        AND cte1.ActivityDate = cte2.GroupedByDateName 

你的第二个查询缺少列别名..假设你加入2个查询通过BusinessId和你通过分组的日期,你需要添加列别名

+0

我已经更新了我的代码建议,它似乎工作。谢谢你!如果更高效,我愿意接受其他方法。 SQL不是我的主要焦点,所以我在这方面学到了很多东西。由于我有一些空值,我使用CASE为空值返回0。 – Terry