【问题标题】:SQL Server : special calculation for value in a viewSQL Server:视图中值的特殊计算
【发布时间】:2020-10-19 15:35:57
【问题描述】:

我想计算列(计算)如下:

Calculated 的值是Value 的两倍,只要没有低于Calculated 的值大于Value,否则应该为零。

基本上,Calculated 列的 MAX 值应至少为其类别 (Column1) 的所有值大小的一半。

我在 SQL Server 数据库中有一个视图,这意味着我不能使用 ORDER BY

我的示例值:

CREATE TABLE test_table2020 
(
    Column1 INT,
    Column2 VARCHAR(1),
    Value INT
)

我这样填充它:

INSERT INTO test_table2020 
VALUES  (1, 'A', 10), (1, 'A', 12),
        (1, 'A', 22), (1, 'A', 23),
        (1, 'A', 13), (1, 'A', 24),
        (2, 'B', 15), (3, 'C', 16),
        (3, 'C', 28), (3, 'C', 31),
        (4, 'D', 9) , (4, 'D', 9) 

我认为我可以从这里获得每个不同 Column1 的最大值(计算值)。

我真的不知道该怎么做,这将适用于几行的情况。

这将显示不带零的计算值:

SELECT *, value * 2 AS Calculated FROM test_table2020

事情是为了计算应该升级到什么价值的东西而不会过度。

【问题讨论】:

  • 附注:插入 数字 值时 - 您应该避免将它们放入单引号 - 只需使用 VALUES (1, 'A', 10), (1, 'A', 12), - 仅使用单引号字符串日期/时间 值 - 不是数字
  • 我已经更新了,谢谢!
  • 每个元组的第三个值也是INT,也不应该用单引号!

标签: sql-server view case partition


【解决方案1】:

与 CASE 配合使用的窗口函数在这里会有所帮助

编辑:不清楚Column2 是否应该嵌入partition 模式有点模棱两可。

示例

Select *
       ,Calculated =  case when (Value*1.5<max(Value) over (partition by column1) 
                                 and  sum(1) over (partition by column1) > 1 )
                                 or ( avg(value) over (partition by column1) = value   )
                           then Value * 2
                           else 0 end
 From  test_table2020

返回

【讨论】:

  • 谢谢比我做的好多了。但是我添加了一些值以进行澄清。不仅有一个值应该为零,而且只要有一些值是其大小的一半,它们中的许多值就应该为零。然后我也添加了一个副本。我将升级问题。无论如何,谢谢,这是一个好的开始。
  • 是column2是一种有文字的描述栏。
  • @MichaelLarsson 有一段时间没上网了。只需要在逻辑上稍作调整。
  • 我认为它有效,谢谢。我一直在处理您的第一个答案并取得了一些进展: Select * ,Calculated = case when (Value*1.5 1 ) 或 ( avg(value) over (partition by column1) = value) 然后 Value * 2 else 0 end From test_table2020
  • @MichaelLarsson 每个人都需要不时的轻推。当你能解决你的问题时总是很有趣。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
相关资源
最近更新 更多