创建一个视图,其中包含按日期分组的两个表的总和(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.dt
和 View2.dt
) 你可以使用 INNER
/LEFT
/RIGHT
或 FULL 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
.
我目前的观点是这样的:
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.dt
和 View2.dt
) 你可以使用 INNER
/LEFT
/RIGHT
或 FULL 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
.