【发布时间】:2016-07-14 07:36:59
【问题描述】:
我正在提取另一个工作簿,其中包含一个表,该表具有像 ItemCreationDate 这样的列,并且大多数列(总共 28 个这样的列)都以单词“Global”开头。我想要
- 将这些“全局”列(包括 ItemCreationDate)拉到 SQL 记录集中, 添加一个名为 Old/New 的新列,然后
- UNPIVOT 它们,即将它们堆叠在一起,然后
- 在下一列中,列出它们的列项及其计数。
- 他们的计数是根据 ItemCreationDate 得出的,其中任何日期 =2015 是新的
- 最终输出应如输出表所示。
我附上了一个Sample.xlsx 文件,我在其中展示了我必须如何从数据表开始到达输出选项卡。这个数据表实际上是我想要拉入记录集并吐出表格的输入,如输出表中所示。我不想创建数据透视表,因为它很麻烦而且数据很多,我想要一种替代的 SQL 方法,其中我可以快速聚合数据并将其一次性插入工作表中。
我没有使用 SQL Server,因此无法使用 UNPIVOT 命令或动态 SQL 循环遍历所有“全局”列。
基本上我想形成一个正确的 SQL 字符串,比如......
Dim arrSQL as variant
......
......
RS.Filter="Like Global*"
......
arrSQL = JOIN(RS.Fields, vbCr)
strSQL = "SELECT [arrSQL], IIF(YEAR([ITEM CREATION DATE])>=YEAR(DATE())-1,""NEW"",""OLD"") AS [New/Old] from [Data$] GROUP BY...."
strSQL = strSQL & " UNION ALL " & vbcr & _
strSQL = strSQL & " ......
现在,在同一记录集上运行 SQL 以减少列并获取所需的数据格式.... 我知道上述内容并不完全正确,但在这些行中有些内容,以便我可以获得正确的输出,如“输出”选项卡中所示。
谁能快速帮忙?
@a_horse_with_no_name 的编辑:
查看示例文件的屏幕截图:
- 数据表: 这实际上是我想拉入记录集的输入工作簿中的表。查看我想要取消透视的各种“全局”列标题及其项目。
- 这是我每次都必须创建的两张中间表“新”和“旧”(实际上我想去掉)。 2015 年或以后发现的任何物品都放入新品中,而其余物品则放入旧品中。
C 列(新):
=COUNTIF(INDEX(New!$A:$D,0,MATCH($A2,New!$1:$1,0)),Output!$B2)
D 列(旧):
=COUNTIF(INDEX(Old!$A:$D,0,MATCH($A2,Old!$1:$1,0)),Output!$B2)
E 列(% 新):
=Output!C2/SUM(C$2:C$6)
F 列(旧百分比):
=Output!D2/SUM(D$2:D$6)
G 列(索引):
=IF(AND(E2<=0,F2<=0),0,IF(AND(E2>0,F2>0),E2/F2,1))
希望这会有所帮助。
【问题讨论】:
-
您正在使用哪个 DBMS?
-
我只使用带有 ADO 的 Excel VBA,而不是 Access 或 SQL Server。我想将另一个输入工作簿的表拉到 ADODB 记录集中并创建输出格式。不知道该怎么做。
-
如果要执行 SQL 语句,您必须使用 some DBMS。
-
ADOdb 似乎是 PHP 的抽象层,而不是数据库系统。
-
对不起,我没有得到你。 PHP从何而来?我正在使用带有 ADO 的 Excel VBA 从另一个工作簿中提取 excel 表。您看过我分享的 Sample.xlsx 工作簿吗? “数据”表实际上是我想要拉入记录集然后吐出最终输出的表,如输出表所示。
标签: sql excel crosstab unpivot vba