【问题标题】:如何修复窗口函数的查询[重复]
【发布时间】:2022-01-23 16:21:04
【问题描述】:

当我尝试执行此错误时,我有以下更新查询。有什么办法可以解决吗?

错误信息:

Msg 4108, Level 15, State 1, Line 41
Windowed functions can only appear in the SELECT or ORDER BY clauses.

完成时间:2021-12-22T17:56:29.7517046+05:30

        update EmpPFContributionTest 
    Set EmpContbtnWithoutTax = 
    (
            case when sum(isnull(epf.emp_contribution,0)) over(partition by epf.emp_no, epf.FinancialYear order by (epf.pcm_year * 100 + pcm_month)) + sum(isnull(epf.vpf,0)) over(partition by epf.emp_no, epf.FinancialYear order by (epf.pcm_year * 100 + epf.pcm_month)) < 3000 
                then sum(isnull(epf.emp_contribution,0)) over(partition by epf.emp_no, epf.FinancialYear order by (epf.pcm_year * 100 + pcm_month)) + sum(isnull(epf.vpf,0)) over(partition by epf.emp_no, epf.FinancialYear order by (epf.pcm_year * 100 + epf.pcm_month))
           else null
           end
    )
    from EmpPFContributionTest epf

【问题讨论】:

  • 您需要使用可更新的 CTE 或子查询。尽管将聚合值存储在表中通常不是一个好主意;每次UPDATEINSERT 单个行时,您都需要更新大量行,因此您将不断成为您的尾巴。 VIEW 会是更好的选择。
  • 实际上与您标记为已回答的previous post 的问题相同,但您随后回复说您实现了一个视图。
  • 看来SQLPro给出的解决方案也和here一样有效。我不明白为什么这是一个新问题。

标签: sql sql-server tsql


【解决方案1】:

您需要使用如下子查询:

WITH 
T AS 
(
SELECT CASE
            WHEN SUM(ISNULL(epf.emp_contribution, 0)) OVER(PARTITION BY epf.emp_no, 
                                                                        epf.FinancialYear
                  ORDER BY(epf.pcm_year * 100 + pcm_month)) + SUM(ISNULL(epf.vpf, 0)) OVER(PARTITION BY epf.emp_no, 
                                                                                                      epf.FinancialYear
                  ORDER BY(epf.pcm_year * 100 + epf.pcm_month)) < 3000
            THEN SUM(ISNULL(epf.emp_contribution, 0)) OVER(PARTITION BY epf.emp_no, 
                                                                        epf.FinancialYear
                  ORDER BY(epf.pcm_year * 100 + pcm_month)) + SUM(ISNULL(epf.vpf, 0)) OVER(PARTITION BY epf.emp_no, 
                                                                                                      epf.FinancialYear
                  ORDER BY(epf.pcm_year * 100 + epf.pcm_month))
            ELSE NULL
         END AS CALC
FROM EmpPFContributionTest epf
)
UPDATE epf
SET    EmpContbtnWithoutTax = CALC
FROM   T
       JOIN epf ON ???

【讨论】:

  • 不需要加入,可以直接更新T
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-10
  • 1970-01-01
  • 2022-10-18
相关资源
最近更新 更多