2016-11-03 8 views
0

私は必要に応じて最初のクエリを実行しています。このクエリは、ユーザーのアクティビティレベルを対応するBusinessIdに集計します。最初のクエリに2番目のクエリを組み込むのに役立つ必要があります

レポートを作成するために、グループ化された週とBusinessIdごとにアクティビティレベルが0以上のUserIdの数を取得する新しい列を作成する必要がありました。 2番目のクエリは私に正しい値を与えます(マージ後に必要以上にデータポイントがあるかもしれませんが)が、これを最初のクエリにマージするのは難しいです。

これはおそらくかなり簡単ですが、他の質問のサンプルからはわかりません。どんな助けもありがとうございます。

/* 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は1つのステートメントで使用できます。あなたの2番目のクエリは、列の別名が欠落している

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 

..私のように自分のコードを更新したあなたはBusinessId、あなたがすることによってグループ化している日で2つのクエリに参加している、あなたは

+0

別名列を追加する必要があると仮定すると提案し、それは動作するようです。有難うございます!もっと効率的なら、私は他の方法にもオープンです。 SQLは私の主な焦点ではないので、私はこれについてかなり勉強しています。私はいくつかのヌル値を持っているので、私はnull値のために0を返すためにCASEを使いました。 – Terry

関連する問題