如何对视图中的列进行求和/分组/排序

Posted

技术标签:

【中文标题】如何对视图中的列进行求和/分组/排序【英文标题】:How to sum/group/sort columns in a view 【发布时间】:2021-02-28 11:04:31 【问题描述】:

我有两个表,Author_Dim 和 Author_Fact 如下:

CREATE TABLE Author_Dim
(
TitleAuthor_ID INT IDENTITY(1,1),
Title_ID CHAR(20),
Title VARCHAR(80),
Type_Title CHAR(12),
Author_ID CHAR(20),
Last_Name   VARCHAR(40),
First_Name VARCHAR(20),
Contract_Author BIT,
Author_Order INT,
PRIMARY KEY (TitleAuthor_ID),
);
GO

CREATE TABLE Author_Fact
(
Fact_ID INT IDENTITY(1,1),
TitleAuthor_ID INT,
Author_ID CHAR (20),
Price DEC(10,2),
YTD_Sales INT,
Advance DEC(10,2),
Royalty INT,
Royalty_Perc INT,
Total_Sales DEC(10,2),
Total_Advance DEC(10,2),
Total_Royalty DEC(10,2)
PRIMARY KEY(Fact_ID),
FOREIGN KEY (TitleAuthor_ID) REFERENCES Author_Dim(TitleAuthor_ID),
);
go

我希望创建一个视图,给出每位作者支付的总版税,然后将其与支付最高的作者排序,即它对 Total_Royalty 列求和,按 Author_ID 对其进行分组,然后按降序对 Total_Royalty 进行排序。

我有以下内容,但我不确定如何将 sum/group/sort 函数添加到视图中:

Create view [Total_Royalty_View] As (
Select Author_Dim.Author_ID, Author_Dim.Last_Name, Author_Dim.First_Name, Author_Fact.Total_Royalty
From Author_Dim
Join Author_Fact
On Author_Fact.TitleAuthor_ID = Author_Dim.TitleAuthor_ID
);
Go

【问题讨论】:

你检查this问题了吗?如果您只是从需要在选择查询期间指定的表中进行选择,则忽略 Order by。 【参考方案1】:

在 SQL 中,它是所有表。您从表中选择,结果又是一个表(由列和行组成)。您可以存储一个选择语句以供重复使用,这称为视图。您也可以编写一个临时视图(from 子句中的子查询)。他们的结果又是表格。

表格被认为是无序的数据集。

因此,您不能编写生成有序行集的视图。

这是视图(无序):

create view total_royalty_view as 
select
  a.author_id,
  a.last_name,
  a.first_name,
  coalesce(r.sum_total_royalty, 0) as total_royalty
from author_dim a
left join
(
  select titleauthor_id, sum(total_royalty) as sum_total_royalty
  from author_fact
  group by titleauthor_id
) r on r.titleauthor_id = a.titleauthor_id;

这里是如何从中选择:

select *
from total_royalty_view
order by total_royalty desc;

【讨论】:

以上是关于如何对视图中的列进行求和/分组/排序的主要内容,如果未能解决你的问题,请参考以下文章

SQL按LIKE(带通配符)进行分组,如何实现正确的求和

如何伸缩 numpy 数组的列?

根据不同的条件对两个不同的列进行分组和求和

如何对列表中由其他列分组的列求和?

如何通过为每个单独的列列出分组后的所有数据并求和

对最后一小时分组中的列值求和,然后将所有 5 的总和作为另一列中的总和