SELECT,MAX? &安培; COUNT在唯一列上然后是GROUP BY

时间:2016-09-26 10:31:06

标签: sql sql-server

我过去几天从头开始学习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?

4 个答案:

答案 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