【问题标题】:Use multiple criteria in SQL Server and return value在 SQL Server 中使用多个条件并返回值
【发布时间】:2020-12-03 05:58:07
【问题描述】:

我有以下标准不会运行。

我试过了:

SELECT
    Main_ID AS [First_Custom_Column],
    CASE 
       WHEN Column_1 = 'Y' AND
            SUM(CASE WHEN Column_3 > 1 THEN Column_2 END) > 0 AND
            COUNT(CASE WHEN Column_3 > 1 THEN 2 END) > 1 # Will fail, Error below. 
           THEN 1 
           ELSE 0
    END AS [Second_Custom_Column]
FROM
    [Table_Name] 
WHERE 
    [Date] = '2020-11-01';

错误:“Main_ID”在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中

然后我尝试了这个:

SELECT
    Main_ID AS [First_Custom_Column],
    CASE 
       WHEN Column_1 = 'Y' AND
            (CASE WHEN Column_3 > 1 THEN 1 END) > 0 AND
            (CASE WHEN Column_3 > 1 THEN 2 END) > 1
           THEN 1 
           ELSE 0
    END AS [Second_Custom_Column]
FROM 
    [Table_Name] 
WHERE 
    [Date] = '2020-11-01';

错误:varchar 值“3344511715”的转换溢出了一个 int 列。

我实际上是在尝试从 Excel 复制 COUNTIFSUMIF。一旦完全复制,我会将查询变成一个函数,但首先我需要它工作。第三列Column_3 包含重复的数据,该函数打算计算这些数据以查看它们是否会再次出现。

有没有人成功复制COUNTIF 的多个条件?怎么样?

【问题讨论】:

  • 请提供样本数据和期望的结果。
  • 正如错误所说,您需要在末尾添加“group by main_id”。这样做有问题吗?
  • 正如它所写的,COUNT() 将尝试计算完整的行列表。如果您需要计算行的子集,您应该尝试COUNT() OVER()
  • 你的困惑怎么办:每次你对一些错误或输出感到困惑时,你应该想象自己是一个 DBMS,清除数据的所有上下文和含义(你不知道),然后做什么是写的。 DBMS 不知道您的数据或语义的性质,也不知道您只需看一眼就可以得到的东西。它会做你要求它做的事情。
  • @Rookie 逐行处理是糟糕的数据库设计,这样的计算可以用单个语句轻松完成。因此,如果您可以更新您的问题并提供您想要调用该函数的源数据以及该数据与参考数据集之间的关系以对其进行计算,那将是一件好事。

标签: sql sql-server


【解决方案1】:

让它工作:

COUNT([Column_3]) OVER (PARTITION BY [Column_3] ORDER BY [Column_3]) AS [xCountIF],
SUM([Column_2]) OVER (PARTITION BY [Column_3] ORDER BY [Column_3]) AS [xSumIF]

如果有人遇到类似问题,请回复此答案,我会引导您完成。

【讨论】:

  • 请解释一下这个解决方案。如果它不包含任何 CASE,它与 COUNT(CASE WHEN Column_3 > 1 THEN 2 END) 有什么关系?解析函数中ORDER BY子句的目的是什么? “它只是有效”并不是从中学习一些东西的有用答案,尤其是当您没有很清楚的问题并自己回答时。
猜你喜欢
  • 1970-01-01
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
  • 2015-12-08
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
相关资源
最近更新 更多