来自两个子查询的值与零之比

时间:2019-07-17 14:13:17

标签: sql sql-server

抱歉,标题令人困惑,但实际上我只有一个基本表,即购物记录购物者访问项目。像这样:

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相当陌生,似乎无法专心做错事情。

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

SQL Server执行整数除法,因此decisionTreeClassifier.score(names_test, label_test) = 0而不是0.5。我发现最简单的解决方案是乘以1.0:

1 / 2