2016-11-03 1 views
0

У меня есть первый запрос, который выполняется по мере необходимости. Этот запрос агрегирует уровни активности для пользователей в соответствующие BusinessIds по неделям.Нужна помощь с включением второго запроса в первый запрос

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

Это, скорее всего, довольно прямое усилие, но я не смог понять это из образцов в других вопросах. Любая помощь приветствуется.

/* 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

Смежные вопросы