首页 > 解决方案 > SQL - 字段有两个记录值,只想显示一个基于另一个字段中的总计的值,然后显示两个值的总计

问题描述

所以我试图创建一个前十名的列表,但是有些公司有 2 个 BUSTYPE 关联,我希望结果对这些值求和,同时只包括与较大值关联的 BUSTYPE

示例查询

SELECT TOP 10 ID, COMPANY, BUSTYPE, sum(value) as VALUES
FROM TABLE
GROUP BY ID, COMPANY, BUSTYPE
ORDER BY VALUES desc

相关输出表1:

ID   COMPANY   BUSTYPE  VALUES
123  orange     Large    1820

相关输出表2:

ID   COMPANY   BUSTYPE  VALUES
123  orange     Small    294

IDEAL TABLE End Result (2114 = 1820 + 294),较大的值与大型总线类型相关联,因此显示

ID   COMPANY   BUSTYPE  VALUES
123  orange     Large    2114

还附上图像以进行进一步的可视化 在此处输入图像描述

我的最终目标是创建一个我可以加入的表,默认为我的主表中的 BUSTYPE,所以我不必担心公司有 2 个 BUSTYPE

或找到一种方法对我的整个数据集执行此操作!

标签: sqlsql-servertableau-api

解决方案


您可以使用窗口函数:

SELECT TOP 10 ID, COMPANY,
       MAX(CASE WHEN seqnum = 1 THEN BUSTYPE END) as BUSTYPE, 
       SUM(value) as VALUES
FROM (SELECT T.*,
             ROW_NUMBER() OVER (PARTITION BY ID, COMPANY ORDER BY VALUE DESC) AS seqnum
      FROM TABLE T
     ) T
GROUP BY ID, COMPANY
ORDER BY VALUES desc;

你也可以使用FIRST_VALUE()这样你就不需要条件聚合:

SELECT TOP 10 ID, COMPANY, FIRST_BUSTYPE, 
       SUM(value) as VALUES
FROM (SELECT T.*,
             FIRST_VALUE(BUSTYPE) OVER (PARTITION BY ID, COMPANY ORDER BY VALUE DESC) AS FIRST_BUSTYPE
      FROM TABLE T
     ) T
GROUP BY ID, COMPANY, FIRST_BUSTYPE
ORDER BY VALUES desc

推荐阅读