SQL Group By + Count包含多个表

问题描述 投票:1回答:1

我正在学习下周的面试,其中有一个小数据分析组件。招聘人员给了我以下示例SQL问题,我在解决问题时遇到了麻烦。我希望我不会咬得比我能咀嚼更多;)..

样本问题:

你有两张桌子:

AdClick表(列:ClickID,AdvertiserID,UserID和其他字段)和AdConversion表(列:ClickID,UserID和其他字段)。

您必须找到1次点击,2次点击等用户的总转化率(转化次数/点击次数)等。

我已经玩了大约一个小时,并继续打路障。我理解COUNT和GROUP BY,但怀疑我错过了一个我不知道的简单SQL功能。这也使我很难通过谷歌找到任何可能的指针/解决方案:不知道要搜索的神奇关键词。

示例输入

dbo.AdConversion
----------------
ClickID UserID
1   1
2   1
4   1
5   3
6   2
7   2
12  1
9   4
10  4

dbo.AdClick
-----------
ClickID AdvertiserID    UserID
1   1   1
2   2   1
3   1   2
4   1   1
5   1   3
6   2   2
7   3   2
8   1   1
9   4   4
10  2   4
11  3   4
12  2   1

Expected Result:
----------------
UserClickCount  ConversionRate
4       80.00%
2       66.67%
1       100.00%     

说明/澄清:

拥有4个AdConversion.ClickIDs(又名转化)的用户拥有80%的通话率。这里只有一个用户UserID 1,它有5个AdClick和4个AdConversions。

拥有2次转化的用户可获得6次Adclicks和4次转化,转化率为66.67%。这是用户ID 2和4。

拥有1次转化的用户(此处仅限UserID 3)对1个AdClick进行1次转化,转化率为100%。


这是一个可能的解决方案,我在Zack评论的一些指导下得出结论。我无法想象这是理想的解决方案,或者它是否有错误:

DECLARE @Conversions TABLE
(
UserID int NOT NULL,
AdConversions int
)

INSERT INTO @Conversions (UserID, AdConversions)
SELECT adc.UserID, COUNT(adc.UserID)
FROM dbo.AdConversion adc
GROUP BY adc.UserID;

DECLARE @Clicks TABLE
(
UserID int NOT NULL,
AdClicks int
)
INSERT INTO @Clicks(UserID, AdClicks)
SELECT UserID, Count (ClickID)
FROM dbo.AdClick
GROUP BY UserID;


SELECT co.AdConversions, CONVERT(decimal(6,3), (CAST(SUM(co.AdConversions) AS float) / SUM(cl.AdClicks))) * 100
FROM @Conversions co
INNER JOIN @Clicks cl
ON co.UserID = cl.UserID
GROUP BY co.AdConversions;

任何建议将不胜感激!

谢谢,迈克尔

sql sql-server group-by count
1个回答
2
投票

你的逻辑似乎很好。这是一个带有公用表表达式的版本,还有一个带有数字转换的小更新:

WITH tConversions as 

(SELECT UserID, COUNT(ClickID) as AdConversions
FROM AdConversion
GROUP BY UserID),

tClicks as

(SELECT UserID, COUNT(ClickID) as AdClicks
FROM AdClick
GROUP BY UserID)

SELECT co.AdConversions, CONVERT(decimal(10,2),CAST(SUM(co.AdConversions) as float) / SUM(cl.AdClicks) * 100) as ConversionRate
FROM tConversions co
INNER JOIN tClicks cl
ON co.UserID = cl.UserID
GROUP BY co.AdConversions

您也可以直接使用子查询:

SELECT co.AdConversions, CONVERT(decimal(10,2),CAST(SUM(co.AdConversions) as float) / SUM(cl.AdClicks) * 100) as ConversionRate
FROM 

(SELECT UserID, COUNT(ClickID) as AdConversions
FROM AdConversion
GROUP BY UserID)

as co

INNER JOIN

(SELECT UserID, COUNT(ClickID) as AdClicks
FROM AdClick
GROUP BY UserID)

as cl

ON co.UserID = cl.UserID
GROUP BY co.AdConversions
© www.soinside.com 2019 - 2024. All rights reserved.