我过去几天从头开始学习SQL。我目前正在尝试为每个报价选择最高版本值的记录,然后对它们进行COUNT计算和GROUP BY帐户ID FROM tbl_quotes。
自:
Account ID Quote Number Revision QuoteID
1 1/R0 0 1
1 1/R1 1 2
1 1/R2 2 3
1 2/R0 0 4
2 2/R0 0 4
2 3/R0 0 5
2 3/R1 1 6
完全不知道如何将报价/修订分组为1,2&我能得到的最接近的是:
SELECT AccountID, COUNT(QuoteNumber) AS [Num of Quotes]
FROM Filteredtbl_quotes
GROUP BY AccountID
返回:
Account ID Num of Quotes
1 4
2 3
但是我想要实现:
Account ID Num of Quotes
1 2
2 2
如何实现MAX功能(如果最合适的话)来计算每个报价1,2和2的最高版本值。 3?
答案 0 :(得分:0)
这将返回每个帐户的每个报价的最高版本
select accountID, quotenumber, max(revision) as revision
From Filteredtbl_quotes
group by accountID, quotenumber
这将返回每个帐户有多少不同的报价
select accountID, count(quotenumber)
from Filteredtbl_quotes
group by accountID
如果这些查询中的任何一个对您有所帮助,不能完全确定您是在查看每个帐户有多少报价或最大报价修订或两者都有,但合并结果集会有点奇怪(您是否会寻找
account 1 | 2 quotes | revision 2
)因为它没有告诉你这两个引文中哪一个是修订版2
将你可以做的两个结合起来
select accountID, count(quotenumber)
from
(select accountID, quotenumber, max(revision) as revision
From Filteredtbl_quotes
group by accountID, quotenumber) as Active
group by accountID
但是你会发现它与我发布的第二个查询的结果相同
答案 1 :(得分:0)
执行此操作的典型方法是使用row_number()
:
select t.*
from (select t.*,
row_number() over (partition by accountID order by revision desc) as seqnum
from Filteredtbl_quotes t
) t
where seqnum = 1;
实际上,关键点在于这不是聚合查询,因为您要选择整行。另一种方法明确选择最新版本。以下是相关子查询的一种方法:
select t.*
from Filteredtbl_quotes t
where t.revision = (select max(t2.revision)
from Filteredtbl_quotes t2
where t.accountID = t2.accountID
);
答案 2 :(得分:0)
您可以使用“修订”列进行此计算。
SELECT AccountID, SUM (CASE revision WHEN 0 THEN 1 ELSE 0 END) AS TOtalRev
FROM Filteredtbl_quotes
GROUP BY AccountID
答案 3 :(得分:0)
将报价编号与修订版本分开
使用distinct
,在substring
内提取(charindex
+ subquery
)。
您现在可以像使用另一个表(数据集)一样使用此子查询
即聚合(count
/ sum
)可以实现
SELECT
SubQuery.AccountID AS [Account ID]
, COUNT(SubQuery.QuoteNum) AS [Num of Quotes]
FROM
(
SELECT DISTINCT
AccountID
, SUBSTRING( QuoteNumber, 0, CHARINDEX('/', QuoteNumber, 1) ) AS QuoteNum
FROM Filteredtbl_quotes
) SubQuery
GROUP BY
SubQuery.AccountID
结果:
Account ID Num of Quotes
1 2
2 2
至于每个QuoteNumber的最新版本,
你可以使用另一个查询:
SELECT
SubQuery.QuoteNum
, MAX(SubQuery.Revision) AS [Latest Revision]
FROM
(
SELECT DISTINCT
SUBSTRING( QuoteNumber, 0, CHARINDEX('/', QuoteNumber, 1) ) AS QuoteNum
, Revision
FROM Filteredtbl_quotes
) SubQuery
GROUP BY
SubQuery.QuoteNum
结果:
QuoteNum Latest Revision
1 2
2 0
3 1