我有一组包含多组数据(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
答案 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_code
和group_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
只是为了防止整数除法。