抱歉,标题令人困惑,但实际上我只有一个基本表,即购物记录,购物者,访问和项目。像这样:
Shopper | Visit ID | Item
John | A | Milk
John | A | Butter
John | B | N/A
Bill | C | Butter
Bill | D | Eggs
此表的最终目标是仅让购物者使其具有唯一性,每个商品都带有一个“比率”列,其中包含购买该购物者的购物者的访问次数百分比项目(或任何项目)。对于购物记录,我正在寻找最终结果如下:
Shopper | Any Item | Milk | Butter | Eggs
John | 50% | 50% | 50% | 0%
Bill | 100% | 0% | 50% | 50%
因此,这是我目前拥有的:
WITH ItemCounts AS
(SELECT
COUNT(DISTINCT VisitID) 'Count of Visits',
Shopper
FROM ShoppingHistory
GROUP BY Shopper
)
SELECT
CastedTable.[Shopper],
FORMAT(SUM(CastedTable.[Has Item?]) / ItemCounts.[Count of Visits], 'P2') 'Item Rate',
FORMAT(SUM(CastedTable.[Has Milk?]) / ItemCounts.[Count of Visits], 'P2') 'Milk Rate',
FORMAT(SUM(CastedTable.[Has Butter?]) / ItemCounts.[Count of Visits], 'P2') 'Butter Rate',
FORMAT(SUM(CastedTable.[Has Eggs?]) / ItemCounts.[Count of Visits], 'P2') 'Egg Rate'
FROM (SELECT
ShoppingHistory.Shopper,
ShoppingHistory.Visit,
CASE WHEN ShoppingHistory.VisitID <> 'N/A' THEN 1 ELSE 0 END 'Has Item?",
MAX(CASE WHEN ShoppingHistory.Item = 'Milk' THEN 1 ELSE 0 END 'Has Milk?",
MAX(CASE WHEN ShoppingHistory.Item = 'Butter' THEN 1 ELSE 0 END 'Has Butter?",
MAX(CASE WHEN ShoppingHistory.Item = 'Eggs' THEN 1 ELSE 0 END 'Has Eggs?"
FROM ShoppingHistory
GROUP BY
ShoppingHistory.Shopper,
ShoppingHistory.VisitID,
'Has Item?'
) CastedTable
INNER JOIN ItemCounts
ON CastedTable.[Shopper] = ItemCounts.Shopper
GROUP BY [Shopper]
CastedTable 为每个购物者和 visit 送给我一行,每个项目都有一列作为标志,表示购物者是否在访问期间购买了该商品。
ItemCounts 只是让我知道我的百分比-每个购物者的总访问次数。
然后,我想对每个项目标记求和,然后除以访问总数,就可以得出购买该项目的访问次数的百分比(如果是“项目费率”,则为他们购买了任何商品)。
但是,我的结果看起来很奇怪。具体来说,当我同时打印出总计项目数(SUM(CastedTable。[是否有项目?])和访问次数(ItemCounts。[访问数])以确保我不会发疯时,我看到了像这样的东西:
Shopper | Any Item | Milk | Butter | Eggs | Sum of Item Flag | Sum of Visits
John | 0% | 0% | 0% | 0% | 1 | 2
Bill | 0% | 0% | 0% | 0% | 2 | 2
基本上,打印出标志总数和访问总数列,我看到了我期望的结果,然后简单地将标志列除以访问列会给我我想要的百分比。但是,在这些百分比列中,我自己看到的只是0%。
这有很多背景,但是本质上我很难弄清为什么看到这些0%。我对SQL相当陌生,似乎无法专心做错事情。
非常感谢您的帮助!
答案 0 :(得分:2)
SQL Server执行整数除法,因此decisionTreeClassifier.score(names_test, label_test)
= 0而不是0.5。我发现最简单的解决方案是乘以1.0:
1 / 2