创建一个视图,其中包含按日期分组的两个表的总和(SQL Server 2008)

Create a view with sum total across two tables grouped by date (SQL Server 2008)

我目前的观点是这样的:

CREATE VIEW dbo.audit 
WITH schemabinding 
AS
    SELECT 
       CONVERT(date, DateAdded) AS dt, 
       COUNT_BIG(*) AS cnt
    FROM 
       dbo.Table1
    GROUP BY 
       CONVERT(date, DateAdded)

哪个returns:

dt          cnt
-----------------
3/13/2015   5000
3/12/2015   1324

我正在尝试从按日期分组的两个表中获取总计计数到一个视图中。这可能吗?

    Table 1                  Table 2
dt          cnt     |     dt          cnt
3/13/2015   5000    |     3/13/2015   1000
3/12/2015   1324    |     3/12/2015   1

To:

    View 1
dt          cnt
3/13/2015   6000
3/12/2015   1325

最好将其保存在一个视图中。因为它只是 运行 总共添加了多少新项目。有什么想法吗?

如果我正确理解你的问题,请尝试这样的操作:

CREATE VIEW dbo.audit WITH schemabinding AS
SELECT CONVERT(Table1.date,DateAdded) AS Table1_dt, 
       COUNT_BIG(Table1.*) AS Table1_cnt,
       CONVERT(Table1.date,DateAdded) AS Table2_dt, 
       COUNT_BIG(Table2.*) AS Table2_cnt
FROM dbo.Table1 INNER JOIN dbo.Table2 ON(Table1.date = Table2.Date)
GROUP BY CONVERT(Table1,DateAdded)

此解决方案假设两个表中的列名相同,并且选择的日期也相同。

假设您的数据使得 table 中可能缺少天数,那么通过创建 table 日期(每天一行)来处理日期会更容易,这样您就可以使用它加入 tables,像这样:

CREATE VIEW dbo.audit WITH schemabinding AS
select
  Dates.Date as dt,
  count_big(Table1.date) as ct_1,
  count_big(Table2.date) as ct_2
from
  Dates
  left outer join Table1 on convert(date, Table1.Date) = Dates.Date 
  left outer join Table2 on convert(date, Table2.Date) = Dates.Date
group by
  Dates.Date

SQL Fiddle: http://sqlfiddle.com/#!6/bf116/3

如果 table 很大,可能会出现一些性能问题,因为 SQL 服务器不会对日期使用索引,因为存在到日期的转换——而这万一您在视图上有 where 子句。如果您需要类似的东西,内联 table 值函数可能会更好,因为这样您就可以拥有日期范围的变量。

假设有两个视图,并且取决于这两个视图之间的 关系 (基于 dt 列的值:View1.dtView2.dt) 你可以使用 INNER/LEFT/RIGHTFULL JOIN 这样:

SELECT  ISNULL(v1.dt, v2.dt) AS dt, ISNULL(v1.cnt, 0) + ISNULL(v2.cnt, 0) AS cnt
FROM    dbo.View1 v1 /*INNER/LEFT/RIGHT*/ FULL JOIN dbo.View2 v2 ON v1.dt = v2.dt

我使用了 FULL JOIN,因为我假设 View1.dt 列中的值在 View2.dt 列中不存在,而且 View2.dt 中也有值] View1.dt 中不存在的列。此外,某些 dt 值可能存在于两个列(视图)中。

注意:我假设第二个视图具有相同的定义,但它使用 Table2 作为数据源:FROM dbo.Table2.