【问题标题】:Sum within a Case statement在 Case 语句中求和
【发布时间】:2018-09-01 22:59:11
【问题描述】:

我正在尝试在满足条件时计算字段。我已经玩了几个小时了,但没有运气:(。

所以我需要找到并计算每个月的保证金。我这样做是为了销售,这很简单

SUM(CASE when CalendarMonth = 1 then TotalSales else 0 end) as 'January',

但是,在尝试计算保证金时,我经常会遇到错误 '无法对包含聚合或子查询的表达式执行聚合函数。'

我是不是走错了路?

    Declare @Sales numeric, @Cost numeric, @Margin Numeric

    Set @Sales = (Select SUM(TotalSales)
            From SalesAnalysis2)

    Set @Cost = (Select SUM(TotalCost)
            From SalesAnalysis2)

    Set @Margin = ((@Sales - @Cost) / @Sales)

    Select distinct

    Case CalendarMonth when 1 then @Margin else 0 end as 'January',
    Case CalendarMonth when 2 then @Margin else 0 end as 'Febuary',
    Case CalendarMonth when 3 then @Margin else 0 end as 'March',
    Case CalendarMonth when 4 then @Margin else 0 end as 'April',
    Case CalendarMonth when 5 then @Margin else 0 end as 'May',
    Case CalendarMonth when 6 then @Margin else 0 end as 'June',
    Case CalendarMonth when 7 then @Margin else 0 end as 'July',
    Case CalendarMonth when 8 then @Margin else 0 end as 'August',
    Case CalendarMonth when 9 then @Margin else 0 end as 'September',
    Case CalendarMonth when 10 then @Margin else 0 end as 'Octocber',
    Case CalendarMonth when 11 then @Margin else 0 end as 'November',
    Case CalendarMonth when 12 then @Margin else 0 end as 'December'

    From SalesAnalysis2

    where CustomerID = 2829 and BranchID = 0 and CalendarYear = Year(Getdate())

这是我做的销售,我需要使用相同的格式来显示利润。 但是同一张表中没有margin字段,需要计算 Sales Example

【问题讨论】:

  • 所以你想为每个月显示相同的保证金值?
  • 我看不出你提供的SUM 有什么问题,CASE ;所以我不认为这是问题所在。例如,这很好用:SELECT SUM(CASE WHEN Object_ID % 2 = 0 THEN 1 ELSE 0 END) FROM sys.tables; 你尝试过的完整查询是什么?
  • 哪一行抛出了这个错误。我无法相信查询会引发该错误。即使它没有出错,你为什么要每个月都使用相同的@Margin?
  • 嘿,对不起,我解释得不好,我上面显示的查询返回底部附加的图像,(全0)我试过玩这个但经常出错!但是是的,我需要显示每个月的保证金

标签: sql sql-server


【解决方案1】:

您需要为每个月执行保证金计算,而不是使用您只设置一次的变量。此外,要将 case 语句用作枢轴,您还需要一个 MAX 聚合来减少返回的行数。否则,您每个月都会得到一行,每行中只有一列的值不是 0。

WITH p AS
  (
    SELECT      CalendarMonth,
                TotalSales = SUM( TotalSales ),
                TotalCost = SUM( TotalCost ),
                Profit = SUM( TotalSales - TotalCost )
      FROM      SalesAnalysis2
      GROUP BY  CalendarMonth
  )
  SELECT
    MAX(CASE CalendarMonth when 1 then p.Profit/p.TotalSales else 0 END) as 'January',
    MAX(Case CalendarMonth when 2 then p.Profit/p.TotalSales else 0 END) as 'Febuary',
    MAX(Case CalendarMonth when 3 then p.Profit/p.TotalSales else 0 END) as 'March',
    MAX(Case CalendarMonth when 4 then p.Profit/p.TotalSales else 0 END) as 'April',
    MAX(Case CalendarMonth when 5 then p.Profit/p.TotalSales else 0 END) as 'May',
    MAX(Case CalendarMonth when 6 then p.Profit/p.TotalSales else 0 END) as 'June',
    MAX(Case CalendarMonth when 7 then p.Profit/p.TotalSales else 0 END) as 'July',
    MAX(Case CalendarMonth when 8 then p.Profit/p.TotalSales else 0 END) as 'August',
    MAX(Case CalendarMonth when 9 then p.Profit/p.TotalSales else 0 END) as 'September',
    MAX(Case CalendarMonth when 10 then p.Profit/p.TotalSales else 0 END) as 'Octocber',
    MAX(Case CalendarMonth when 11 then p.Profit/p.TotalSales else 0 END) as 'November',
    MAX(Case CalendarMonth when 12 then p.Profit/p.TotalSales else 0 END) as 'December'
  FROM    p

由于您没有提供任何架构或数据,因此您需要对其进行修改以适合您的数据。它可能无法为您写入的数据提供准确的结果,但它至少应该为每个月返回不同的值,并有望让您更接近所需的解决方案。

【讨论】:

    【解决方案2】:

    你想要一个sum()

    Select sum(Case CalendarMonth when 1 then @Margin else 0 end) as January,
           sum(Case CalendarMonth when 2 then @Margin else 0 end) as February,
           . . .
    From SalesAnalysis2
    where CustomerID = 2829 and BranchID = 0 and
          CalendarYear = Year(Getdate())
    

    【讨论】:

    • 嘿,试过这个仍然返回 0 :(
    • @M.tovey 。 . .然后CalendarMonth 不采用值 1, 2, 3, 。 . .
    【解决方案3】:

    请尝试:

    Declare @Sales numeric, @Cost numeric, @Margin Numeric
    
    Set @Sales = (Select SUM(TotalSales)
            From SalesAnalysis2)
    
    Set @Cost = (Select SUM(TotalCost)
            From SalesAnalysis2)
    
    Set @Margin = ((@Sales - @Cost) / @Sales)
    
    Select distinct
    
    Case Month(YourDateColumn) =1 then @Margin else 0 end as 'January',
    Case Month(YourDateColumn) =2 then @Margin else 0 end as 'Febuary',
    Case Month(YourDateColumn) =3 then @Margin else 0 end as 'March',
    Case Month(YourDateColumn) =4 then @Margin else 0 end as 'April',
    Case Month(YourDateColumn) =5 then @Margin else 0 end as 'May',
    Case Month(YourDateColumn) =6 then @Margin else 0 end as 'June',
    Case Month(YourDateColumn) =7 then @Margin else 0 end as 'July',
    Case Month(YourDateColumn) =8 then @Margin else 0 end as 'August',
    Case Month(YourDateColumn) =9 then @Margin else 0 end as 'September',
    Case Month(YourDateColumn) =10 then @Margin else 0 end as 'Octocber',
    Case Month(YourDateColumn) =11 then @Margin else 0 end as 'November',
    Case Month(YourDateColumn) =12 then @Margin else 0 end as 'December'
    
    From SalesAnalysis2
    
    where CustomerID = 2829 and BranchID = 0 and CalendarYear = Year(Getdate())
    

    【讨论】:

    • 谢谢你的回复,我试过了,但它仍然只返回0s
    • 你能用很少的数据定义你的表结构吗?
    猜你喜欢
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    相关资源
    最近更新 更多