Sql 对具有不同分组记录的字段求和
我有一个非常棘手的SQL问题,我无法弄清到底。我有一个SQL视图,其中列出了服务器及其到电源板的电源连接(大约44500个连接到大约8000个电源板。我现在需要做的是创建一个视图,显示每个电源板的单个条目及其总负载(以瓦特为单位) 这是我使用的表格的一个简短示例: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
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;
这可能看起来像是“选择不同答案”上的一个微小变化,但并非出于以下原因:
- SELECT DISTINCT定义为执行排序,然后消除重复项。因此,存储要求是有足够的额外空间来存储工作结果集,以及所选排序算法所需的任何内容
- GROUP BY定义为收集存储桶,因此存储需求仅针对实际存在的存储桶数量(即唯一值)
作为已发布答案的替代方案,您也可以尝试以下方法:
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;
这可能看起来像是“选择不同答案”上的一个微小变化,但并非出于以下原因:
- SELECT DISTINCT定义为执行排序,然后消除重复项。因此,存储要求是有足够的额外空间来存储工作结果集,以及所选排序算法所需的任何内容
- GROUP BY定义为收集存储桶,因此存储需求仅针对实际存在的存储桶数量(即唯一值)