Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

kết hợp ngày hôm nay và tổng số trước đó từ ngày hôm nay của cùng một cột đó dẫn đến một truy vấn sql

Tôi đã sửa đổi SQL Fiddle được đưa ra trong nhận xét sẽ cung cấp cho bạn kết quả mong muốn, miễn là bạn đã có tổng số hàng ngày:

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

Nếu bạn muốn biến nó thành một câu lệnh, bạn sẽ cần thay thế Tổng số hàng ngày bằng truy vấn con của bạn để cung cấp cho bạn tổng số hàng ngày. Tuy nhiên, tôi khuyên bạn nên tạo một chế độ xem được gọi là Tổng số hàng ngày và sử dụng chế độ đó.

CHỈNH SỬA:

Bạn có thể sử dụng CTE để tạo phạm vi ngày của mình thay vì bảng tạm thời. Tôi đã sửa đổi truy vấn đầy đủ của bạn mà bạn nói là hoạt động để tham gia với CTE thay vì @temp. Tôi không có cách nào để kiểm tra nó mặc dù. Nếu cách này không hiệu quả, vui lòng tạo SLQ Fiddle bằng lược đồ của bạn và tôi sẽ thử lại.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để xác định các phiên bản SQL Server đã cài đặt và phiên bản của chúng?

  2. Cần liệt kê tất cả các trình kích hoạt trong cơ sở dữ liệu SQL Server với tên bảng và lược đồ của bảng

  3. Cách khắc phục “Yêu cầu GIAO DỊCH COMMIT không có GIAO DỊCH BẮT ĐẦU tương ứng” trong SQL Server

  4. Chuyển đổi số nguyên thành hex và hex thành số nguyên

  5. PowerShell - Liệt kê tất cả các phiên bản SQL trên hệ thống của tôi?