sql >> データベース >  >> RDS >> Sqlserver

今日とその同じ列の今日から前の合計を組み合わせると、1 つの SQL クエリになります

    コメントで指定された SQL Fiddle を変更しました。これにより、1 日の合計が既にある場合に、目的の出力が得られます。

    http://www.sqlfiddle.com/#!6/09168/2

    DECLARE @startDate datetime
    DECLARE @endDate datetime
    
    SELECT @startDate = '2012-10-08'
    SELECT @endDate = '2012-10-12'
    
    SELECT
        DT1.ddate,
        DT1.phone,
        DT1.letter,
        DT1.email,
        DT1.web,
        SUM(DT2.phone) phoneTotal,
        SUM(DT2.letter) letterTotal,
        SUM(DT2.email) emailTotal,
        SUM(DT2.web) webTotal 
      FROM
        DailyTotals DT1
        LEFT JOIN DailyTotals DT2 ON DT1.ddate >= DT2.ddate AND DT2.ddate >= @startDate
      WHERE
        DT1.ddate <= @endDate
      GROUP BY
      DT1.ddate,
      DT1.phone,
      DT1.letter,
      DT1.email,
      DT1.web
      

    1 つのステートメントにしたい場合は、DailyTotals を、毎日の合計を取得するサブクエリに置き換える必要があります。ただし、DailyTotals というビューを作成して使用することをお勧めします。

    編集:

    一時テーブルの代わりに CTE を使用して日付範囲を生成できます。 @temp の代わりに CTE と結合するように機能するという完全なクエリを修正しました。私はそれをテストする方法がありません。これが機能しない場合は、スキーマで SLQ Fiddle を作成してください。もう一度試します。

    WITH Dates AS
    (
        SELECT CONVERT(date, MIN(ComplaintTime)) AS ddate,
        MAX(ComplaintTime) as EndDate
        FROM
          Complaints
        UNION ALL
        SELECT DATEADD(DAY, 1, ddate), EndDate
        FROM Dates
        WHERE DATEADD(DAY, 1, ddate) <= EndDate
        )
    
    SELECT * FROM 
    
            (select ddate,ISNULL(L,0) AS Letter,
              ISNULL(P,0) AS Phone,
              ISNULL(E,0) AS Email,
              ISNULL(W,0) AS WEB 
              FROM 
              (
                select   ComplaintMedia_Abbri,
              ddate,COUNT(ComplaintMedia)  as c
                from    Complaint 
                INNER JOIN Dates
                ON convert(date,ComplaintDate)=ddate OPTION (MAXRECURSION 500)
                WHERE isnull(Receivedby_Dept,Relatesto_Dept)=1     
                group by ComplaintMedia_Abbri,ddate
        ) p 
    
        pivot (SUM(c) FOR ComplaintMedia_Abbri IN (E,W,L,P)) AS pvt 
    
        ) AS [A]
    
        INNER JOIN 
    
        (
        select ddate,ISNULL(L,0) AS LetterTot,
          ISNULL(P,0) AS PhoneTot,
          ISNULL(E,0) AS EmailTot,
          ISNULL(W,0) AS WEBTot
          FROM 
          (
    
        select   ComplaintMedia_Abbri,ddate,
        COUNT(ComplaintMedia_Abbri)  as c
        from    Complaint 
    
        INNER JOIN Dates OPTION (MAXRECURSION 0)
        ON CONVERT(date,ComplaintDate) <= ddate OPTION (MAXRECURSION 0)
    
        WHERE isnull(Receivedby_Dept,Relatesto_Dept)=1     
        group by ComplaintMedia_Abbri,ddate
        ) p 
    
       pivot (SUM(c) FOR ComplaintMedia_Abbri IN (E,W,L,P)) AS pvt
    
    
    
        ) AS [B]
    
       ON A.ddate=B.ddate
    
       order by A.ddate
      


    1. PHPで文字列を1つずつインクリメントする

    2. PLSQL JDBC:最後の行IDを取得する方法は?

    3. 内側のSELECTに無効な識別子が含まれている場合、外側のSELECTを強制的に失敗させます

    4. MySQL ONUPDATECURRENT_TIMESTAMPが更新されない