【问题标题】:Compare month over month data and find difference in SQL比较逐月数据并找出 SQL 中的差异
【发布时间】:2019-08-12 16:35:20
【问题描述】:

如何从同一张表中动态计算月间差异。

我有下表,我正在尝试比较每个月的 FT(全职员工)和 TE(员工总数)(每月比较 01 到 12)并找出差异。如果该月的 FT 超过 TE,则显示 ID、公司、FT 和 TE,否则通过。谁能帮我解决这个问题。

<!DOCTYPE html>
<html>
<head>
<style>
table, th, td {
  border: 1px solid black;
  border-collapse: collapse;
}
th, td {
  padding: 5px;
  text-align: left;    
}
</style>
</head>
<body>

<p>FT = Full Time Employee <br>
TE = Total Employee <br>
01-12 = month
</p>

<table style="width:100%">
  <tr>
    <th>ID</th>
    <th>Company</th>
    <th>FT01</th>
    <th>FT02</th>
    <th>FT03</th>
    <th>FT04</th>
    <th>FT05</th>
    <th>FT06</th>
    <th>FT07</th>
    <th>FT08</th>
    <th>FT09</th>
    <th>FT10</th>
    <th>FT11</th>
    <th>FT12</th>
    <th>TE01</th>
    <th>TE02</th>
    <th>TE03</th>
    <th>TE04</th>
    <th>TE05</th>
   <th>TE06</th>
    <th>TE07</th>
   <th>TE08</th>
   <th>TE09</th>
   <th>TE10</th>
    <th>TE11</th>
    <th>TE12</th>
    
  </tr>
  <tr>
    <td>100</td>
    <td>A</td>
    <td>3</td>
    <td>3</td>
    <td>3</td>
    <td>3</td>
    <td>3</td>
    <td>3</td>
    <td>3</td>
    <td>3</td>
    <td>3</td>
    <td>3</td>
    <td>3</td>
    <td>3</td>
    <td>4</td>
    <td>4</td>
    <td>4</td>
    <td>4</td>
    <td>4</td>
    <td>4</td>
    <td>4</td>
    <td>4</td>
    <td>4</td>
    <td>4</td>
    <td>4</td>
    <td>4</td>
  </tr>
    <tr>
    <td>101</td>
    <td>B</td>
    <td>5</td>
    <td>5</td>
    <td>5</td>
    <td>5</td>
    <td>5</td>
    <td>5</td>
    <td>5</td>
    <td>5</td>
    <td>5</td>
    <td>5</td>
    <td>5</td>
    <td>5</td>
    <td>5</td>
    <td>5</td>
    <td>5</td>
    <td>5</td>
    <td>5</td>
    <td>5</td>
    <td>5</td>
    <td>5</td>
    <td>5</td>
    <td>5</td>
    <td>5</td>
    <td>5</td>
  </tr>
      <tr>
    <td>102</td>
    <td>C</td>
    <td>7</td>
    <td>7</td>
    <td>7</td>
    <td>7</td>
    <td>7</td>
    <td>7</td>
    <td>7</td>
    <td>7</td>
    <td>7</td>
    <td>7</td>
    <td>7</td>
    <td>7</td>
    <td>6</td>
    <td>6</td>
    <td>6</td>
    <td>6</td>
    <td>6</td>
    <td>6</td>
    <td>6</td>
    <td>6</td>
    <td>6</td>
    <td>6</td>
    <td>6</td>
    <td>6</td>
  </tr>
  
</table>

</body>
</html>

【问题讨论】:

  • 我删除了不兼容的数据库标签。请仅使用您真正使用的数据库进行标记。
  • FT 怎么可能超过 TE?数据错误?
  • 您想要逐月使用该数据结构吗?
  • 是否有可能重新组织您的 SQL 表(在多个表中,而不是每个月都有一列)以便于比较?
  • 是的,请@MichaelMuryn。不知何故,数据以单独的 FT 和 TE 列数据存储在该模式中。谢谢

标签: sql database data-analysis


【解决方案1】:

将问题分解为多个部分!

这个问题实际上是几个“我该怎么做?”的问题,这个问题几乎相当于一个“为我写这段代码”的请求。

因此,我将帮助解决第一个问题:数据结构。

您有一个非规范化的表,虽然重组数据库会有所帮助,但有时无法做到这一点。但是,如果您可以将数据转化为规范化的数据,它会使查询变得更容易很多

那么我们就这样做吧!

如果表格看起来像这样,问题会容易得多:

ID
Company
MonthNum
TotalEmployees
FullTimeEmployees

...所以让我们编写一个查询以获取该格式的数据:

select ID, Company, 1 as MonthNum, TE01 as TotalEmployees, FT01 as FullTimeEmployees from ...
UNION ALL
select ID, Company, 2 as MonthNum, TE02 as TotalEmployees, FT02 as FullTimeEmployees from ...
UNION ALL
select ID, Company, 3 as MonthNum, TE03 as TotalEmployees, FT03 as FullTimeEmployees from ...
-- etc, going up to 12.

现在我们可以通过将其用作子查询来对该数据执行查询:

select WhateverColumns from
(
   -- that query from the previous section
) as normalizedData
where WhateverConditionsYouWant

有意义吗?将问题分解为具体步骤,然后开始解决这些步骤。第一个是以更易于使用的格式获取数据,我展示了如何解决这个问题。现在您需要继续编写查询以获取您所需要的特定数据。祝你好运!

【讨论】:

  • 谢谢@Kevin。我按照您的解释通过以某种格式获取数据来编写并且它起作用了。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-11
相关资源
最近更新 更多