Excel 从所选月份和年份的列表中导出部门分配

Excel 从所选月份和年份的列表中导出部门分配,excel,report,Excel,Report,我需要在Excel中创建一些基本报告 主要问题是,我收集数据的数据库将部门分配存储在三列中,但只存储每个新分配的开始日期 因此,该文件看起来像: Pers_ID Department_ID Start_Date 1001 01 2012-01-01 1001 02 2013-05-01 1001 05 2015-08-01 我需要某种公式,用于检查单元格(例如A1 be“2013

我需要在Excel中创建一些基本报告

主要问题是,我收集数据的数据库将部门分配存储在三列中,但只存储每个新分配的开始日期

因此,该文件看起来像:

    Pers_ID Department_ID Start_Date
    1001    01            2012-01-01
    1001    02            2013-05-01
    1001    05            2015-08-01
我需要某种公式,用于检查单元格(例如A1 be“2013-08-01”),并在给定时间返回PER_ID的部门ID

我尝试用数组公式计算所有日期和“A1”之间的最小差值,但这也会导致将来分配部门ID


非常感谢您的帮助,因为我在没有任何有效解决方案的情况下挣扎了数小时。提前感谢!

根据您的列表,我添加了其他记录来测试公式,如下所示:

Pers_ID Department_ID Start_Date
1001    01            2012-01-01
1001    02            2013-05-01
1001    05            2015-08-01
1002    02            2012-05-01
1002    04            2013-01-01
1003    01            2016-01-01

Selection criteria
Person: 1002
Date:   2016-03-06

Intermediate Results
Begin:  <First formula below>
End:    <Second formula below>

Results
Dept.   <The last formula goes here>
并计算指定的
Pers\u ID
发生的频率:

COUNTIF(A2:A7;B10) // will return 2
为了简化结果公式,我们可以将结果“缓存”在单元格
B14
B15

之后,我们可以使用
OFFSET()
函数创建一个范围。我们从数据集的开头开始,根据我们的计算向下移动范围。注意
MATCH()-1
,因为如果所需的
Pers\u ID
在第一行,我们不必移动范围(因此指定偏移量为0).根据
COUNTIF
的结果,我们指定范围的高度:

OFFSET(B2;MATCH(B9;A2:A7;0)-1;0;COUNTIF(A2:A7;B9)) // without "cache"
OFFSET(B2;B14-1;0;B15) // with "cache"

OFFSET(B2;4-1;0;2) // partially evaluated
它们都返回B5:B6作为
Pers\u ID=1002

要在范围内选择适当的行,请使用
索引()将公式换行。

有点棘手。我们需要在
C
列中指定日期范围,其高度与
Pers\u ID
的高度相同。 我们主要使用与现在相同的公式,但我们不想在
B11
中搜索指定的日期,而是要搜索最近的日期(即确切日期或更早的日期)。为此,我们使用
SMALL()

SMALL(OFFSET(C2;B14-1;0;B15);COUNTIF(OFFSET(C2;B14-1;0;B15);"<="&B11)) // returns 2013-01-01 (in fact it returns 41275 which is the 1st March 2013)
整个公式如下:

// Without "cache"
=INDEX(OFFSET(B2;MATCH(B10;A2:A7;0)-1;0;COUNTIF(A2:A7;B10));MATCH(SMALL(OFFSET(C2;MATCH(B10;A2:A7;0)-1;0;COUNTIF(A2:A7;B10));COUNTIF(OFFSET(C2;MATCH(B10;A2:A7;0)-1;0;COUNTIF(A2:A7;B10));"<="&B11));OFFSET(C2;MATCH(B10;A2:A7;0)-1;0;COUNTIF(A2:A7;B10));0);1)

// With "cache"
=INDEX(OFFSET(B2;B14-1;0;B15);MATCH(SMALL(OFFSET(C2;B14-1;0;B15);COUNTIF(OFFSET(C2;B14-1;0;B15);"<="&B11));OFFSET(C2;B14-1;0;B15);0);1)
//不带“缓存”

=索引(偏移量B2;匹配(B10;A2:A7;0)-1;0;COUNTIF(A2:A7;B10));匹配(小偏移量C2;匹配(B10;A2:A7;0)-1;0;COUNTIF(A2:A7;B10));COUNTIF(偏移量C2;匹配(B10;A2:A7;0)-1;0;COUNTIF(A2:A7;B10));“您的日期是yyyy-mm-dd还是yyyy-dd-mm-mm?为了便于在excel中使用,我将大多数日期转换为YYYYYY-mm格式(不再有日期)。列中的日期是“datetime”sql server列。因此,yyyy mm dd+时间。很抱歉出现了巨大的延迟。您的解决方案非常有效!我做了一些小的调整,并添加了一些VBA代码,在ODBC刷新后自动引用列表,以确保没有人会破坏它。
INDEX(OFFSET(B2;B14-1;0;B15);<Row>;1)
SMALL(OFFSET(C2;B14-1;0;B15);COUNTIF(OFFSET(C2;B14-1;0;B15);"<="&B11)) // returns 2013-01-01 (in fact it returns 41275 which is the 1st March 2013)
MATCH(SMALL(OFFSET(C2;B14-1;0;B15);COUNTIF(OFFSET(C2;B14-1;0;B15);"<="&B11));OFFSET(C2;B14-1;0;B15);0) // returns 2
// Without "cache"
=INDEX(OFFSET(B2;MATCH(B10;A2:A7;0)-1;0;COUNTIF(A2:A7;B10));MATCH(SMALL(OFFSET(C2;MATCH(B10;A2:A7;0)-1;0;COUNTIF(A2:A7;B10));COUNTIF(OFFSET(C2;MATCH(B10;A2:A7;0)-1;0;COUNTIF(A2:A7;B10));"<="&B11));OFFSET(C2;MATCH(B10;A2:A7;0)-1;0;COUNTIF(A2:A7;B10));0);1)

// With "cache"
=INDEX(OFFSET(B2;B14-1;0;B15);MATCH(SMALL(OFFSET(C2;B14-1;0;B15);COUNTIF(OFFSET(C2;B14-1;0;B15);"<="&B11));OFFSET(C2;B14-1;0;B15);0);1)