Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 对具有不同分组记录的字段求和_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql 对具有不同分组记录的字段求和

Sql 对具有不同分组记录的字段求和,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个非常棘手的SQL问题,我无法弄清到底。我有一个SQL视图,其中列出了服务器及其到电源板的电源连接(大约44500个连接到大约8000个电源板。我现在需要做的是创建一个视图,显示每个电源板的单个条目及其总负载(以瓦特为单位) 这是我使用的表格的一个简短示例: POWERSTRIP_VOB_ID DEVICE_VOB_ID WATTS 5FA38587-FA3E-4BF0-B87C-B782B0F

我有一个非常棘手的SQL问题,我无法弄清到底。我有一个SQL视图,其中列出了服务器及其到电源板的电源连接(大约44500个连接到大约8000个电源板。我现在需要做的是创建一个视图,显示每个电源板的单个条目及其总负载(以瓦特为单位)

这是我使用的表格的一个简短示例:

POWERSTRIP_VOB_ID                       DEVICE_VOB_ID                           WATTS
5FA38587-FA3E-4BF0-B87C-B782B0FD9284    988BD4A4-CAC7-4CC9-B1F8-274D75C48796    17
5FA38587-FA3E-4BF0-B87C-B782B0FD9284    67174BE5-9065-4131-8817-EB584F940A39    17
5FA38587-FA3E-4BF0-B87C-B782B0FD9284    44713911-F1D8-45E6-9FFA-DCD29F0A5EDA    1164
5FA38587-FA3E-4BF0-B87C-B782B0FD9284    D4495808-AE45-4F8E-ADB0-A97C5F79FD70    17
5FA38587-FA3E-4BF0-B87C-B782B0FD9284    A9B17915-85F2-4FE1-915A-044312177845    7481
5FA38587-FA3E-4BF0-B87C-B782B0FD9284    5AC7AA8A-8A56-4E09-A607-98985782B32B    1746
5FA38587-FA3E-4BF0-B87C-B782B0FD9284    A9B17915-85F2-4FE1-915A-044312177845    7481
5FA38587-FA3E-4BF0-B87C-B782B0FD9284    A9B17915-85F2-4FE1-915A-044312177845    7481
如您所见,所有线路都具有相同的
POWERSTRIP\u VOB\u ID
。在本例中,所有服务器都至少有一个到此POWERSTRIP的连接。您还将注意到,以
A9B17915
开头的设备有三个到电源板的连接

如果我使用
DISTINCT
groupby
POWERSTRIP\u VOB\u ID
和瓦特的总和,我得到的结果是25404。我需要做的基本上是忽略任何重复的连接,以便查询只对POWERSTRIP的服务器求和一次

在本例中,我将寻找以下各项的总和:

POWERSTRIP_VOB_ID                       DEVICE_VOB_ID                           WATTS
5FA38587-FA3E-4BF0-B87C-B782B0FD9284    988BD4A4-CAC7-4CC9-B1F8-274D75C48796    17
5FA38587-FA3E-4BF0-B87C-B782B0FD9284    67174BE5-9065-4131-8817-EB584F940A39    17
5FA38587-FA3E-4BF0-B87C-B782B0FD9284    44713911-F1D8-45E6-9FFA-DCD29F0A5EDA    1164
5FA38587-FA3E-4BF0-B87C-B782B0FD9284    D4495808-AE45-4F8E-ADB0-A97C5F79FD70    17
5FA38587-FA3E-4BF0-B87C-B782B0FD9284    A9B17915-85F2-4FE1-915A-044312177845    7481
5FA38587-FA3E-4BF0-B87C-B782B0FD9284    5AC7AA8A-8A56-4E09-A607-98985782B32B    1746
这将导致视图中出现1条记录,如下所示:

POWERSTRIP_VOB_ID                       WATTS
5FA38587-FA3E-4BF0-B87C-B782B0FD9284    10442
希望我已经解释得足够好了

我玩过
groupby
DISTINCT
SUM(DISTINCT)
,似乎无法获得我需要的输出

任何帮助都将不胜感激

非常感谢


西蒙

我想这就是你需要的:

SELECT POWERSTRIP_VOB_ID, SUM(WATTS)
FROM (
        SELECT DISTINCT POWERSTRIP_VOB_ID, DEVICE_VOB_ID, WATTS
        FROM   myTable
)
GROUP BY POWERSTRIP_VOB_ID;
内部查询排除重复项,外部查询进行求和


从您的描述中,我了解到两条记录不可能具有相同的POWERSTRIP_VOB_ID和DEVICE_VOB_ID值,但瓦特不同。我认为这表明数据库不一致。无论如何,如果出现这种情况,上述查询将对这两个值求和。

我认为这就是您需要的:

SELECT POWERSTRIP_VOB_ID, SUM(WATTS)
FROM (
        SELECT DISTINCT POWERSTRIP_VOB_ID, DEVICE_VOB_ID, WATTS
        FROM   myTable
)
GROUP BY POWERSTRIP_VOB_ID;
内部查询排除重复项,外部查询进行求和


从您的描述中,我了解到两条记录不可能具有相同的POWERSTRIP_VOB_ID和DEVICE_VOB_ID值,但瓦特不同。我认为这可能表明数据库不一致。无论如何,如果出现这种情况,上述查询将对这两个值求和。

作为已发布答案的替代方法,您也可以尝试这:

SELECT POWERSTRIP_VOB_ID, SUM(WATTS)
FROM (
    SELECT POWERSTRIP_VOB_ID, DEVICE_VOB_ID, WATTS
    FROM   myTable
    GROUP BY POWERSTRIP_VOB_ID, DEVICE_VOB_ID, WATTS
)
GROUP BY POWERSTRIP_VOB_ID;
这可能看起来像是“选择不同答案”上的一个微小变化,但并非出于以下原因:

  • 在大型数据集上,web上给出了许多示例,其中GROUP BY的执行速度明显快于SELECT DISTINCT。作为程序员,我们可能会看到这两种操作在这种情况下产生相同的结果集,但这两种操作的语义不同,并且在某些情况下,输出实际上会有所不同-例如,每当有计算列时

    • SELECT DISTINCT定义为执行排序,然后消除重复项。因此,存储要求是有足够的额外空间来存储工作结果集,以及所选排序算法所需的任何内容
    • GROUP BY定义为收集存储桶,因此存储需求仅针对实际存在的存储桶数量(即唯一值)
    两者的时间要求都是n*Log(n)。当tempdb不在SSD上时,性能差异可能更明显

  • 所有真正的SQL程序员都知道,任何使用DISTINCT的行为看起来都是业余的(这可能是有意识或潜意识地欣赏上述性能差异的结果)因此,不愿意表现为业余爱好者的SQL程序员在原则上总是会将SELECT DISTINCT替换为GROUP BY。我在这里是在开玩笑——但鉴于上述第(1)点,这实际上是一个合理的理由,让我们记住,SELECT DISTINCT的几乎所有有效用法都可以替换为GROUP BY

  • 使用SELECT DISTINCT最常见的情况是缺少JOIN子句,从而导致人为重复。业余SQL程序员不了解这一事实,他们会使用SELECT DISTINCT消除重复项。业余程序员编写的SQL调优最常见的方法之一就是搜索SELECT DISTINCT的所有用法并添加缺少JOIN子句,或者如果确实需要消除重复项,则利用(1)并替换为GROUP BY。非业余SQL程序员表示此步骤已通过从不使用SELECT DISTINCT来执行,从而节省了任何审阅者的工作量


  • 作为已发布答案的替代方案,您也可以尝试以下方法:

    SELECT POWERSTRIP_VOB_ID, SUM(WATTS)
    FROM (
        SELECT POWERSTRIP_VOB_ID, DEVICE_VOB_ID, WATTS
        FROM   myTable
        GROUP BY POWERSTRIP_VOB_ID, DEVICE_VOB_ID, WATTS
    )
    GROUP BY POWERSTRIP_VOB_ID;
    
    这可能看起来像是“选择不同答案”上的一个微小变化,但并非出于以下原因:

  • 在大型数据集上,web上给出了许多示例,其中GROUP BY的执行速度明显快于SELECT DISTINCT。作为程序员,我们可能会看到这两种操作在这种情况下产生相同的结果集,但这两种操作的语义不同,并且在某些情况下,输出实际上会有所不同-例如,每当有计算列时

    • SELECT DISTINCT定义为执行排序,然后消除重复项。因此,存储要求是有足够的额外空间来存储工作结果集,以及所选排序算法所需的任何内容
    • GROUP BY定义为收集存储桶,因此存储需求仅针对实际存在的存储桶数量(即唯一值)
    两者的时间要求都是n*Log(n)。当tempdb不在SSD上时,性能差异可能更明显

  • 所有真正的SQL程序员都知道,任何使用DISTINCT的行为看起来都是业余的(这可能是由于有意识或潜意识地欣赏上述性能差异所致)。因此,不想表现为业余的SQL程序员总是会用GROUP替换SELECT DISTINCT