【问题标题】:sql query to sum the total countsql查询求和总计数
【发布时间】:2015-02-09 14:37:59
【问题描述】:

我必须计算与列 system_name 对应的每个不同的arrival_time(数据库表中的列)的总计数值之和。我的sql查询是:

SELECT   system_name, COUNT(distinct arrival_time) AS c 
FROM     i2alarmlog 
WHERE    Ack_status = 0 
AND      Direction='CAME' 
AND      system_name in('I2-tciu database',
                        'i2-vcs logging',
                        'Indus1 Vacuum',
                        'Indus2 TCIU',
                        'Indus2 Vacuum',
                        'Septum_SIP2',
                        'TL3 Vacuum') 
GROUP BY system_name 

UNION ALL

SELECT   'sum' system_name,
          Count(distinct arrival_time) 
FROM     i2alarmlog 
WHERE    Ack_status=0 
AND      Direction='CAME'
AND      system_name in( 'I2-tciu database'
                        ,'i2-vcs logging',
                         'Indus1 Vacuum',
                         'Indus2 Vacuum',
                         'Septum_SIP2',
                         'TL3 Vacuum')

当我运行这个 sql 查询时,总和显示为 1841,但实际上是 1845。

i2-vcs logging      2
I2-tciu database    2
Indus1 Vacuum       19
Indus2 TCIU         120
Indus2 Vacuum       1691
Septum_SIP2         8
TL3 Vacuum          3
sum                 1841

【问题讨论】:

    标签: sql-server aggregate-functions


    【解决方案1】:

    在您的第二个查询中,distinct 部分应用于所有数据。这意味着,如果您为 2 种不同的产品拥有相同的 arrival time,则只会计算一次,而不是每种产品都计算一次。这可以解释您的预期结果和实际结果之间的差异。

    你可以这样做:

    ;with cte as
    (SELECT   system_name, COUNT(distinct arrival_time) AS c 
     FROM     i2alarmlog 
     WHERE    Ack_status = 0 
     AND      Direction='CAME' 
     AND      system_name in('I2-tciu database','i2-vcs logging','Indus1 Vacuum','Indus2 TCIU','Indus2 Vacuum','Septum_SIP2','TL3 Vacuum') 
     GROUP BY system_name )
    
    select system_name, c
    from cte
    union
    select 'sum', sum(c) as c
    from cte
    

    Demo

    【讨论】:

    • 谢谢..我还有一个疑问,即如何将获得的输出存储在列表中并通过jsp显示。当我这样做时,会显示 null。
    • 请创建一个单独的问题以获得有关此问题的帮助。您可以链接此问题以获取上下文。谢谢!
    • 我已经有stackoverflow.com/questions/27416457/… 没有帮助。
    【解决方案2】:

    一种解决方案是使用内联视图并计算总和,如下所示:

    SELECT   system_name, COUNT(distinct arrival_time) AS c 
    FROM     i2alarmlog 
    WHERE    Ack_status = 0 
    AND      Direction='CAME' 
    AND      system_name in('I2-tciu database','i2-vcs logging','Indus1 Vacuum','Indus2 TCIU','Indus2 Vacuum','Septum_SIP2','TL3 Vacuum') 
    GROUP BY system_name 
    
    UNION ALL
    
    select 'TotalSum' as TotalSum, sum(s.c) as TotalValue
    from
    (
        SELECT   system_name, COUNT(distinct arrival_time) AS c 
        FROM     i2alarmlog 
        WHERE    Ack_status = 0 
        AND      Direction='CAME' 
        AND      system_name in('I2-tciu database','i2-vcs logging','Indus1 Vacuum','Indus2 TCIU','Indus2 Vacuum','Septum_SIP2','TL3 Vacuum') 
        GROUP BY system_name 
    ) s
    

    使用此解决方案,达到了最大聚合级别 (2) ( sum(count(value)) )。

    【讨论】:

    • 它起作用了...你能告诉我如何将获得的输出存储在一个列表中并通过 jsp 显示它。当我这样做时,就会显示 null。
    • @SRY_JAVA,我对 jsp 相关的知识一无所知,但你可以试试这个:select * from () as a
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    相关资源
    最近更新 更多