SQL:多行总和/按问题分组

时间:2018-08-06 16:50:45

标签: sql sql-server

我在其他地方看过,但没有找到答案,因此希望有人拥有更多的SQL经验可以帮助我解决这个问题!

我有以下投资组合表:

Ticker    Company_ID   Exposure
ABC         1            0.02
DEF         2            0.10
XYZ         3            0.01
GTS         3            0.01

以及以下信息表(其中有重复项以及其他信息,并且不能删除):

Company_ID   Company_Name
   1           Alpha
   2           Defacto
   2           Defacto
   3           XeeWhy
   3           XeeWhy

我希望结果的格式为

Company_ID   Company_Name   Sum(Exposure)
    1         Alpha           0.02
    2         Defacto         0.10
    3         XeeWhy          0.02

我可以执行一些操作以从投资组合表中获取简单的总和,但这不包括公司名称:

Select Distinct Company_ID, Sum(Exposure)
From Portfolio
Group By Company_ID

但是每当我加入表以获取公司名称时,我都会得到重复的总和,具体取决于它们在信息表中出现的次数。

任何帮助或指针将不胜感激!

谢谢!

4 个答案:

答案 0 :(得分:1)

您最简单的方法是使JOIN到您的公司表DISTINCT,如下所示:

Select p.Company_ID, 
    c.Company_name,
    Sum(Exposure) as Exposure
From Portfolio p
INNER JOIN (
    SELECT DISTINCT Company_id, Company_Name
    FROM Companies) c
    ON c.Company_id = p.Company_ID
Group By p.Company_ID,
    c.Company_Name

答案 1 :(得分:0)

尝试加入一个子查询,该子查询获取不同的公司信息,一个子查询,获取分组的投资组合数据。

SELECT x1.company_id,
       x1.company_name,
       x2.exposure
       FROM (SELECT DISTINCT
                    company_id,
                    company_name
                    FROM information) x1
            LEFT JOIN (SELECT company_id,
                              sum(exposure) exposure
                              FROM portfolio
                              GROUP BY company_id) x2
                      ON x2.company_id = x1.company_id;

我不确定,是要结果中的所有公司还是仅要有投资组合数据的公司。如果需要后者,请将LEFT JOIN更改为INNER JOIN

答案 2 :(得分:0)

尝试以下简单查询:

SELECT (SELECT TOP 1 Company_Name FROM CompanyTable
        WHERE Company_ID = P.Company_ID) Company_Name,
       Sum(Exposure)
FROM Portfolio P
GROUP BY Company_ID

答案 3 :(得分:0)

我使用了CTE来使聚合变得更简单:

SupportedMediaTypes