对不起,标题混乱,但本质上,我有一个基本的表,购物历史,独特的购物者,访问,和项目。就像这样:
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为每个购物者和访问者提供一行,每项一列充当标志,代表购物者在访问期间是否购买了该商品。
ItemCounts只是给我一个百分比的分母--每个购物者的总访问量。
然后,我想把每个项目的标志相加,除以总访问次数,得到他们购买该项目的访问百分比(或者,在“项目比率”情况下,他们购买任何项目的访问百分比)。
然而,我的结果看起来很奇怪。具体来说,当我打印出两个被加项目计数(和(CastedTable.Has项?))时,访问次数(ItemCounts.Count表示访问)以确保我不会发疯,我看到的是这样的情况:
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相当陌生,似乎无法指摘我做错了什么。
任何帮助都是非常感谢的!
发布于 2019-07-17 06:14:25
Server进行整数除法,因此1 / 2
=0而不是0.5。我发现最简单的解决方案是乘以1.0:
FORMAT(SUM(CastedTable.[Has Item?]) * 1.0 / ItemCounts.[Count of Visits], 'P2') Item_Rate,
https://stackoverflow.com/questions/57077973
复制