【问题标题】:Merge Value Of Multiple Record based on similar criteria in Access/SQL/Excel在 Access/SQL/Excel 中基于相似条件合并多条记录的值
【发布时间】:2017-07-17 04:24:02
【问题描述】:

目前我有一个像这样的行表

我想将所有具有相同 FlNo 的 Row 合并为一个 Row,合并行的数据遵循以下条件:

  • “FlNo”保持不变
  • “开始”将是最早的日期
  • 'End' 将是最近的日期
  • 'Pattern' 将代表星期几,因此它将是每一行中出现的所有星期的组合(即,如果第 1 行有 Pattern = "12347",第 2 行 = "34567",组合 Pattern will = "1234567", ie2: 如果 Row1 = "357", Row2 = "357",组合模式将保持不变 = "357")。这部分最困扰我,因为我还没有找到解决它的算法。
  • 'AC_Name' 将是 FlNo 出现次数最多的值(在本例中为 32)

所以最后一行是

FlNo  |   Start     |   End         | Pattern  | AC_Name |  
 660  | 26/Mar/2017 |   28/Oct/2017 | 1234567  |    32   |

由于原始数据是 Excel 电子表格,因此应提供基于 Excel (VBA)/Access (VBA/SQL) 环境的解决方案。它可以先在 Excel 中处理,然后导入到 Access 或导入到 Access,然后在那里处理或一半/一半)。我个人更喜欢在 Access 和 SQL 中处理,因为大约有 13000 行数据。

请帮助我找到处理这些数据的解决方案。非常感谢你们。

【问题讨论】:

  • 修复你的数据结构!一周中的每一天都有一个单独的列,用一个标志(比如“0”和“1”)来表示这一天是否是“模式”的一部分。
  • @GordonLinoff 感谢您的回复。是的,我可以这样做,但是如何将数据合并在一起?
  • 这是一个有趣的问题。希望您以特定方式提供数据而不是图像。问题的第二部分不清楚。您的实际数据库 excel/access/sql 服务器是什么?可能是这样SSIS 的理想方案。

标签: sql sql-server database excel vba


【解决方案1】:

一旦你为你的模式列正确修复了你的数据结构

您可以使用 min()、max() 和 group by .. 联合到一个选定的表,其中 max 表示计数

  select 
    t1.FlNo
,  min(t1.Start )
,  max( t1.End) 
, max(D1)
, max(D2)
, max(D3)
, max(D4)   
, max(D5)
, max(D6)
, max(D7)
, t2.AC_Name 
  from my_table t1
  INNER JOIN ( 

      select FlNo, AC_Name, max(my_count) from ( 
      select FlNo, AC_Name , count(*) AS  my_count
      from my_table
      group by FlNo, AC_Name ) t 
      GROUP BY lNo, AC_Name
      having my_count = max(my_count)
  ) t2  on t1.FlNo = t2.FlNo

【讨论】:

  • 这似乎对我不起作用(我只将 my_table 更改为我的表名,还在第一行的 t1.FlNo 之后添加了一个逗号)。错误表示 Count(*) my_count 有错误
  • 另外,在我有 7 列模式的新结构后,mamed: D1,D2,.... 值为 0 或 1。我如何也将它们加入?
  • 我仍然收到错误"Your query does not include the specified expression 'my_count = max(my_count)' as part of an aggregate function"。我还没有完全理解代码,但我注意到第三个选择组你把它们作为 t 但没有使用它,是故意的吗?
  • 由于某种原因仍然出现相同的错误,也许它可以在 MySQL 中运行,但在 MSSQL 中不行?无论如何感谢您的帮助,非常感谢!
【解决方案2】:

一旦您修复了数据,除了Ac_Name 之外的所有查询将是:

select FINo, min(start), max(end),
       max(IsMonday), max(IsTuesday), . . .
from t
group by FINo;

获取Ac_Name 很棘手。这应该有效:

select FINo, min(start), max(end),
       max(IsMonday), max(IsTuesday), . . .,
       (select top 1 ac_name
        from t as t2
        where t2.FINo = t.FINo
        group by ac_name
        order by count(*) desc, ac_name
       ) as ac_name
from t
group by FINo;

【讨论】:

  • 如果我还想选择 3 个其他字段,Blkt、STD、STA。我想选择与 STD 和 STA 等效的 Max(Blkt)(每个 blkt 都有自己的 STD 和 STA)。非常感谢!
  • @TracNgon 。 . .新问题应该作为问题提出,而不是作为 cmets。但是,您也许可以重复子查询以获取更多列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-14
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
  • 2017-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多