2016-09-26 82 views
0

我已经花了几天的时间从头开始学习SQL。我目前正在尝试为每个报价选择最高版本版本值的记录,然后对它们进行COUNT处理,并将GROUP BY帐户ID从tbl_quotes中进行计数。SELECT,MAX? &COUNT上的唯一列然后GROUP BY

来源:

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 & 3.我能得到的最接近的是:

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函数(如果最合适的话)用COUNT计算每个报价的最高修订值1,2 & 3?

+1

这是您的预期结果?第一个还是第二个? – Keppy

+0

如何使用ROW_NUMBER()并获得它的最大值。 – Keppy

+0

第二个。我会研究Row_Numbers,感谢您的建议! – JustAnotherDowny

回答

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 ),因为那doesn “T告诉你哪两个引号是在第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 

,但你会发现它有相同的结果,第二个查询我张贴反正

+0

谢谢您的回答。我在组合后。这个想法是一个报价的最新版本将被认为是主动的,使以前的修订是多余的。由于没有代表这一点的列,因此尝试计算“活动”引号的总数变得困难。 – JustAnotherDowny

+0

我已经添加了一个查询,结合了这两个,但是如果每个报价总是有一个活动的修订版本(包含修订版本0),那么您正在为相同的结果做额外的处理。源表中是否有任何引号没有任何活动的修订? – MarkD

+0

或者我错过了一个观点,并且一个报价只有修订版本0才能成为非活跃账户? – MarkD

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 
        ); 
+0

谢谢你的回答,绝对有帮助。抱歉,这与原始问题描述有点不同,但如果AccountID位于另一个没有重叠列的表上,我们需要对查询进行什么样的更改?我可以通过INNER JOIN上的一系列连接tbl_accounts和tbl_quotes表,除此之外,我猜测它是一个CROSS JOIN? – JustAnotherDowny

+0

@JustAnotherDowny。 。 。这个答案是针对你问的问题。如果您有涉及其他表格的其他问题,请询问*其他问题。 –

0

您可以使用版本列进行此计算。

SELECT AccountID, SUM (CASE revision WHEN 0 THEN 1 ELSE 0 END) AS TOtalRev 
FROM Filteredtbl_quotes 
GROUP BY AccountID 
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