使用Group By SQL计算组的百分比

时间:2016-05-25 15:56:47

标签: sql sql-server group-by

我有一组包含多组数据(Vehicle_Code)的数据,组中的每个项目(PK:Cusip_Sedol)都有一个不唯一的特定代码(GIC_Code)。我试图找到每组(Vehicle_Name)数据中每个代码(GIC_Code)的百分比。 这是我到目前为止的SQL Select语句:

SELECT H.vehicle_code, 
       G.group_name, 
       Count(D.cusip_sedol) AS Total 
FROM   tbltrading_holdings AS H 
INNER JOIN tbltrading_stocks_data_stocks AS D 
        ON H.cusip_sedol = D.cusip_sedol 
LEFT JOIN tbltrading_gic AS G 
       ON D.gic_code = G.gic_code 
WHERE  vehicle_code IN (SELECT vehicle_code 
                        FROM   tbltrading_vehicles 
                        WHERE  vehicle_name LIKE 'J%') 
  AND D.gic_code IS NOT NULL 
GROUP  BY H.vehicle_code, 
          G.group_name 
ORDER  BY vehicle_code 

3 个答案:

答案 0 :(得分:1)

SELECT
   H.vehicle_code,
   G.group_name,
   VehicleTotal = Count(D.cusip_sedol) OVER (PARTITION BY H.vehicle_code, G.group_name),
   d.gic_code,
   gic_codePercentPerVehicleName =
      Count(d.gic_code) OVER () * 1.0 / Count(*) OVER (PARTITION BY V.vehicle_name),
   gic_codePercentPerVehicleName2 =
      Count(d.gic_code) * 1.0 / Count(*) OVER (PARTITION BY V.vehicle_name)
FROM
   dbo.tbltrading_holdings H
   INNER JOIN tbltrading_stocks_data_stocks D
      ON H.cusip_sedol = D.cusip_sedol
   LEFT JOIN dbo.tbltrading_gic G
      ON D.gic_code = G.gic_code
   INNER JOIN dbo.tbltrading_vehicles V
      ON H.vehicle_code = V.vehicle_code
      AND v.vehicle_name LIKE 'J%'
WHERE
   D.gic_code IS NOT NULL 
GROUP BY
   H.vehicle_code,
   D.gic_code,
   G.group_name,
   V.vehicle_name
ORDER BY
   H.vehicle_code
;

这里有一些未知因素迫使我做出某些假设。你可以看到我对每个车辆的名称和#34; gic代码提出了两种不同的解释。可能意味着。

对于初学者来说,为了提供与vehicle_name相关联的gic_code,我们必须进行真正的加入,而不是IN(实际上是EXISTS) 。但是,相同的gic_code是否可以加入不同的vehicle_name值? (因为有一个加入它们的中间vehicle_code?)我假设它可能发生这种情况,如果确实如此,那么查询会给你带来无用的结果,在你能帮助你之前,你必须更好地制定你正在寻找的东西。

接下来,由于您选择了这么多列,这会使他们成为GROUP BY的一部分,因此结果都很混乱。但是一旦你这样做,那么所有的窗口函数都必须包含分区到" break"他们离开了分组。此查询可能运行缓慢,因为它可以立即执行大量操作,这可能会导致对表进行多次扫描。现在的情况是,对于每个特定的gic_code,您将获得许多具有相同值的行,因为查询必须公开(多个)vehicle_codegroup_name组合每一个人。这真的是你想要的吗?

如果您删除了一些显示的列,则可能会获得更好的结果,因为这样可以删除至少部分PARTITION BY个表达式。

最后,我不确定我的分区是否正确。只有您知道与其他表的连接相关的每列的基数。

答案 1 :(得分:0)

我认为你非常接近。是否算上Sedol为你工作?如果是这样,那么只需按照百分比的组名计数除以:

x_eq_y

答案 2 :(得分:0)

您需要的是所有行的总数。 。 。你可以使用窗口函数来获得它。因此,将选择更改为:

SELECT H.vehicle_code, 
       G.group_name, 
       Count(D.cusip_sedol) AS Total,
       Count(D.Cusip_sedol)*1.0 / Sum(Count(D.Cusip_sedol)) Over () as p_total
. . .

请注意,*1.0只是为了防止整数除法。