【问题标题】:Can I use PARTITION BY with a GROUP BY clause? SQL Server 2012我可以将 PARTITION BY 与 GROUP BY 子句一起使用吗? SQL Server 2012
【发布时间】:2016-01-14 05:37:49
【问题描述】:

我是窗口函数的新手。这是包含 4 种水果的原始表格。

fruit   quantity
orange  100
banana  27
banana  20
orange  5
melon   5
apple   1
banana  10
banana  4
banana  36
banana  86
banana  47
apple   32
banana  7
banana  5
banana  3

是否可以将其转换为每种水果占所有物品总量的百分比?这是我想要的:

fruit       total       percentage
apple       33          9%
banana      245         63%
orange      105         27%
melon       5           1%

这是我正在尝试的代码,但它给了我一个错误:

SELECT fruit
, SUM(quantity) / SUM(quantity) OVER () * 100
FROM fruit_inventory
GROUP BY fruit

如果我撤消 GROUP BY 并删除第一个 SUM(quantity),则会得到多个如下所示的记录:

fruit   quantity    percentage
apple   1           0%
apple   32          8%
banana  27          7%
banana  20          5%
banana  10          3%
banana  4           1%
banana  36          9%
banana  86          22%
banana  47          12%
banana  7           2%
banana  5           1%
banana  3           1%
melon   5           1%
orange  100         26%
orange  5           1%

【问题讨论】:

  • 在 OVER 子句中添加 ORDER BY 水果
  • 那仍然失败。我应该删除一些东西吗?
  • 这是什么错误,可能会在添加一些括号后尝试乘以 100
  • 列 'quantity' 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中。
  • 我删除了 * 100 并没有改变。

标签: tsql sql-server-2012 aggregate partition


【解决方案1】:

使用聚合sum 的窗口sum

SELECT  Fruit ,
        SUM(Quantity) AS Quantity ,
        SUM(Quantity) / SUM(SUM(Quantity)) OVER () * 100
FROM    @fruitbasket
GROUP BY Fruit;

【讨论】:

  • 这正是我想要的!我想我开始更多地了解 OVER 的用法。非常感谢。
【解决方案2】:

我相信这就是您要找的:

declare @fruitbasket table
    (
     Fruit nvarchar(50),
     Quantity decimal(19, 5)
    );

insert  into @fruitbasket
        (Fruit, Quantity)
values  (N'orange', 100),
        (N'banana', 27),
        (N'banana', 20),
        (N'orange', 5),
        (N'melon', 5),
        (N'apple', 1),
        (N'banana', 10),
        (N'banana', 4),
        (N'banana', 36),
        (N'banana', 86),
        (N'banana', 47),
        (N'apple', 32),
        (N'banana', 7),
        (N'banana', 5),
        (N'banana', 3);

select  Fruit,
        sum(Quantity) as Quantity,
        sum(Quantity) / (
                         select sum(Quantity) as Total
                         from   @fruitbasket
                        ) * 100 as PercentageOfTotal
from    @fruitbasket
group by Fruit;

【讨论】:

  • 我喜欢这个答案,因为我现在开始更多地使用相关子查询。
【解决方案3】:

使用 CTE(通用表表达式),您可以获得想要的结果。 总体而言,CTE 确实具有更好的性能和更好的可读性。

WITH cte AS
(
    SELECT DISTINCT 
        Fruit
        ,SUM(Quantity) OVER (PARTITION BY fruit ORDER BY fruit) AS sumProducts
        ,SUM(SUM(Quantity)) OVER ()  AS totalProducts
    FROM stackOverflow
    GROUP BY 
        Fruit
        ,Quantity
)
SELECT Fruit, CAST(sumProducts AS INT) AS sumProducts, CAST(100 * sumProducts / totalProducts AS DECIMAL(5,2)) AS percentage
FROM cte

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    相关资源
    最近更新 更多