【问题标题】:Transpose & Deduplicate - SQL Server转置和重复数据删除 - SQL Server
【发布时间】:2021-01-01 21:23:40
【问题描述】:

我想从 SQL Server 2019 中提取数据,以便能够在报表中的折线图上呈现它。我的数据是给定技能的工作机会数量。基本上,我正在抓取工作委员会,以便能够估计在给定时间段内针对给定技能有多少工作机会。

我编写了一个简单的group by 查询,它得到了我想要的数据:

  select sn.Name, csr.CreatedAt, sum(csr.JobOffersCount) as Amount
  from   CompanySkillRegionDemands csr,
         SkillNames sn
  where csr.SkillId = sn.SkillId
  and   sn.Language = 'en'
  group by sn.Name, csr.CreatedAt
  order by CreatedAt

数据看起来像:

Name CreatedAt Amount
ASP.NET MVC 2020-05-13 40
Webforms 2020-05-13 2
Microsoft Visio 2020-05-13 6
SAP BI 2020-05-13 1

很长一段时间。问题是重复的名称和日期。每个日期都有一个名称,这是正确的,但在将其提取到 csv 后,也很难从中绘制 excel 图表。

我更喜欢有一个矩阵,其中日期在 Y 轴上,技能名称在 X 轴上,如下所示:

.NET SAP
2020-05-13 2 3
2020-05-14 1 5

我将如何绕过它?

【问题讨论】:

  • 如何定义“.net”和“.sap”?
  • 它只是数据中的技能名称,例如 ASP.NET MVC 或 Java。我有超过 300 种类似的技能,并且每个日期都有 300 个技能名称。
  • 进化——没有人应该使用old-style joins

标签: sql sql-server sql-server-2019


【解决方案1】:

您可以使用聚合。像这样的:

select csr.CreatedAt,
       sum(case when sn.name like '%.net%' then csr.JobOffersCount end) as cnt_net,
       sum(case when sn.name like '%sap%' then csr.JobOffersCount end) as cnt_sap
from  CompanySkillRegionDemands csr join
      SkillNames sn
      on csr.SkillId = sn.SkillId and   sn.Language = 'en'
group by csr.CreatedAt
order by CreatedAt;

我不确定这些列的真正逻辑是什么,但它类似于这里的内容。

【讨论】:

  • 恐怕不行,我有 300 多个这样的技能,所以我必须将所有 300 个都放在 select 子句中
  • 每条记录都包含工作机会的数量,其中包含给定日期的给定技能。例如:2021-01-01 有 10 个工作机会包含 java 一词
猜你喜欢
  • 2016-08-29
  • 1970-01-01
  • 1970-01-01
  • 2019-12-04
  • 2017-11-16
  • 1970-01-01
  • 2018-05-22
  • 2012-05-30
  • 1970-01-01
相关资源
最近更新 更多