当前位置: 首页 > 面试题库 >

SQL Server中多个列上的聚合函数

子车心思
2023-03-14
问题内容

我在#temp表中具有以下数据:

Id  code       Fname       CompanyId    FieldName         Value
----------------------------------------------------------------
465 00133   JENN WILSON       1           ERA              1573
465 00133   JENN WILSON       1           ESHIFTALLOW      3658
465 00133   JENN WILSON       1           NETPAY          51560

我想做以下操作,即

一行将在两列上加法,即ERA + ESHIFTALLOW 另一行将在三列上减法加法,即 NETPAY - ERA + ESHIFTALLOW
我曾尝试在SQL Server中使用case语句。

以下是所需的输出

哪里Field1= ERA + ESHIFTALLOWFiled2=NETPAY - ERA + ESHIFTALLOW

Id  code       Fname       CompanyId    FieldName         Value
----------------------------------------------------------------
465 00133   JENN WILSON       1           Field1          5231
465 00133   JENN WILSON       1           Filed2          46329

我曾尝试使用SQL SERVER Case语句,但未获得正确的输出


问题答案:

我看到至少有两种方法可以得到这些结果。分组或枢纽

在下面的示例中,显示了2种方法。

CREATE TABLE #Temp (Id INT, code VARCHAR(5), Fname VARCHAR(20), CompanyId INT, FieldName VARCHAR(20), Value INT);

insert into #Temp (Id, code, Fname, CompanyId, FieldName, Value)
values 
(465,00133,'JENN WILSON',1,'ERA',1573),
(465,00133,'JENN WILSON',1,'ESHIFTALLOW',3658),
(465,00133,'JENN WILSON',1,'NETPAY',51560);

with Q AS (
  SELECT Id, code, Fname, CompanyId, 
  sum(case when FieldName = 'ERA' then Value end) as ERA,
  sum(case when FieldName = 'ESHIFTALLOW' then Value end) as ESHIFTALLOW,
  sum(case when FieldName = 'NETPAY' then Value end) as NETPAY
  from #Temp
  group by Id, code, Fname, CompanyId
)
select Id, code, Fname, CompanyId, 'Field1' as FieldName, (ERA +  ESHIFTALLOW) as Value from Q
union all
select Id, code, Fname, CompanyId, 'Field2', (NETPAY - ERA +  ESHIFTALLOW) from Q
;

with Q AS (
  SELECT Id, code, Fname, CompanyId, 
  (ERA +  ESHIFTALLOW) as Field1,
  (NETPAY - ERA +  ESHIFTALLOW) as Field2
  FROM (SELECT * FROM #Temp) s
  PIVOT ( SUM(VALUE) FOR FieldName IN (ERA, ESHIFTALLOW, NETPAY)) p
)
select Id, code, Fname, CompanyId, 'Field1' as FieldName, Field1 as Value from Q
union all
select Id, code, Fname, CompanyId, 'Field2', Field2 from Q
;

请注意,使用的是SUM(VALUE)而不是MAX(VALUE)。在这种情况下,它将产生相同的结果。这只是一个选择。



 类似资料:
  • 问题内容: 我有一个包含多个包含整数(a1,a2,a3等)的字段的postgresql表。 我想一次跨多个列运行汇总函数(均值,标准差等)。(其中一些可能具有合理数量的空值,因此我不想只生成列平均值然后再对它们求平均值)。 我可以得到一组整数 但是我然后无法获取聚合函数以将此作为输入。 谁能给我任何有关如何使它工作的提示? 问题答案: 使用子查询,您可以使用所有行: 您还可以对行进行分组,例如:

  • 问题内容: 我有三个表: 我正在尝试创建一个视图,以便获得table的所有字段,where中的项目计数以及where中所有标签的文本数组。如果我们有: 结果应返回: 这是我到目前为止所拥有的: 这些是我得到的结果(请注意,这是不正确的): 将始终是标签的数量,而不是不同的计数值。我尝试重新排序/修改和子句,它们返回不同的结果,但不是我想要的结果。我认为我在使用该功能时遇到了麻烦,但是我不确定是否是

  • 问题内容: 我试图从一个列中选择最大值,同时按具有多个重复值的另一个非唯一id列进行分组。原始数据库如下所示: 使用以下方法可以很好地工作: 它返回一个像这样的表: 我希望能够在不影响GROUP BY函数的情况下添加其他列,以将诸如name和type之类的列包括到输出表中,例如: 但是它总是输出一个错误,说我需要在select语句中使用聚合函数。我应该怎么做呢? 问题答案: 您遇到了每组最多的问题

  • 我有索引,其中每个文档都有这样的结构: 我需要计算每个演员对应的电影数量(演员可以在actor_1_name、actor_2_name或actor_3_name字段中) 这3个字段的映射是: 有没有一种方法,我可以聚合的结果,可以结合所有3个演员领域的条款,并给出一个单一的聚合。 目前,我正在为每个actor字段创建单独的聚合,并通过我的JAVA代码将这些不同的聚合合并成一个。 通过创建不同的聚合

  • 问题内容: 我需要函数,该函数返回字符串列表。 我在表中有这样的数据: 我需要这样的功能(在oracle中类似的功能): 返回如下内容: 有任何想法吗? 问题答案: 您正在寻找GROUP_CONCAT() 尝试这个: 当然,您可以得到结果。

  • 我需要聚合一个基于1分钟时间间隔的数据集。当我尝试此操作时,它会抛出错误: 我的数据集如下所示 org.apache.spark.sql.AnalysisException:无法解析(datetime,value)中的列名“60秒”;在org.apache.spark.sql.dataset$$anonfun$resolve$1.apply(dataset.scala:216)在org.apach