【问题标题】:Problem to fix a question with WindowFunction使用 WindowFunction 解决问题的问题
【发布时间】:2019-10-30 18:06:44
【问题描述】:

对于学校,我必须使用窗口函数回答以下问题。

对于每一年、每个月、对于每个产品类别,请指明该月的营业额占该类别年营业额的百分比。

我尝试使用窗口功能,但它不起作用。因为我不知道如何使用 over (partition by) 功能

select 
  catcode, 
  year(besteldatum) as jaar, 
  month(besteldatum) as maand, 
  sum(regelomzet) as omzet, 
  sum(regelomzet) / (
    select sum(regelomzet)
    from ##joinall t2
    where t2.catcode = t1.catcode 
      and year(t2.besteldatum) = year(t1.besteldatum)
    ) * 100 as perc
from ##joinall t1
group by catcode, year(besteldatum), month(besteldatum)
order by catcode, year(besteldatum), month(besteldatum)

【问题讨论】:

  • "我尝试使用窗口功能..." 那么它在哪里呢?
  • 我删除了那部分,因为它不起作用,现在使用子查询,但我的老师需要查看窗口函数。我猜它会在总和之间(regelomzet 和 *100 perc。但我不确定
  • 这就是这个网站的重点。您发布您的尝试(损坏的代码),我们可以尝试帮助您修复代码。发布有效的查询毫无意义。
  • select catcode, year(besteldatum) as jaar, month(besteldatum) as maand, (SUM(regelomzet) / SUM(regelomzet) OVER (PARITION BY catcode, year(besteldatum))) * 100 as perc from ##joinall group by catcode, year(besteldatum), month(besteldatum) order by catcode, year(besteldatum), month(besteldatum) 但是当我尝试这样的事情时,我得到一个错误

标签: sql window-functions


【解决方案1】:

有了window functions,就可以了解它们。
它们在 GROUP BY 之后得到处理。

因此,总和是可能的。

OVER 中的 PARTITION BY 有点类似于 GROUP BY。

SELECT 
  catcode, 
  year(besteldatum) as jaar, 
  month(besteldatum) as maand, 
  sum(regelomzet) as omzet,

  cast(
  (sum(regelomzet) /
    SUM(sum(regelomzet)) OVER (PARTITION BY catcode, year(besteldatum))) * 100
   as decimal(5,2)) as perc

FROM bestellingen t
GROUP BY catcode, year(besteldatum), month(besteldatum)
ORDER BY 1, 2, 3;

【讨论】:

  • 错误: 'SELECT catcode, year(besteldatum) as jaar, month(besteldatum) as maand, sum(regelomzet) as omzet, cast((sum(regelomzet) / SUM(sum( regelomzet)) OVER (PARTITION BY catcode, year(besteldatum))) * 100 as decimal(5,2)) as perc FROM bestellingen t GROUP BY catcode, year(besteldatum), month(besteldatum) ORDER BY 1, 2, 3 ; ' nanodbc/nanodbc.cpp:1587: 42S02: [Microsoft][ODBC SQL Server Driver][SQL Server]无效的对象名 'bestellingen'。执行 SQL 块失败
  • 我的示例使用了不同的表名。
  • 很高兴它有帮助 :) 顺便说一句,大多数时候窗口函数不与普通聚合结合使用。所以看到一个真正有用的挑战很有趣。
猜你喜欢
  • 1970-01-01
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-22
相关资源
最近更新 更多