Sub SqlSelectExample()
'list elements in col C not present in col B
Dim con As ADODB.Connection
Dim rs As ADODB.Recordset
Set con = New ADODB.Connection
con.Open "Driver={Microsoft Excel Driver (*.xls)};" & _
"DriverId=790;" & _
"Dbq=" & ThisWorkbook.FullName & ";" & _
"DefaultDir=" & ThisWorkbook.FullName & ";ReadOnly=False;"
Set rs = New ADODB.Recordset
rs.Open "select ccc.test3 from [Sheet1$] ccc left join [Sheet1$] bbb on ccc.test3 = bbb.test2 where bbb.test2 is null ", _
con, adOpenStatic, adLockOptimistic
Range("g10").CopyFromRecordset rs '-> returns values without match
rs.MoveLast
Debug.Print rs.RecordCount 'get the # records
rs.Close
Set rs = Nothing
Set con = Nothing
End Sub
MOD(CEILING.MATH([index]/PRODUCT([size of set 0]:[size of previous set]))-1,[size of current set])+1
这个公式给出了集合中每个元素的索引(有序位置),其中集合i的大小为n_i。因此,如果我们有四个集合,大小将是[n_1,n_2,n_3,n_4]。 使用该索引,可以只使用index函数从集合中选择任何属性(假设每个集合都是一个有几个列的表,可以使用index([table of the set],[this result],[column number of attribute]))。
说明
解释了公式的两个主要组成部分,循环组成部分和分配组成部分。
循环组件
=MOD([partitioning component]-1, [size of current set])+1
7条答案
按热度按时间bq9c1y661#
这里有三个维度:dim1(ABC)、dim2(123)、dim3(XYZ)。
以下是如何使用标准Excel而不使用VBA制作二维笛卡尔积:
1)垂直绘制dim 1,水平绘制dim 2。在交点上连接维成员:
2)取消透视数据。使用ALT-D-P启动透视表向导(不要按住ALT,按一次)。选择“多个合并范围”-->创建单个页面。-->选择所有单元格(包括标题!)并将其添加到列表中,请按下一步。
3)垂直绘制结果值并分解连接的字符串
瞧,你有交叉连接。如果需要添加另一个尺寸,请再次重复此算法。
干杯
康斯坦丁
hgb9j2n62#
这里有一个非常简单的方法来生成任意数量的列表的笛卡尔积,使用透视表:
https://chandoo.org/wp/generate-all-combinations-from-two-lists-excel/
这个例子是针对两个列表的,但它适用于任何数量的表和/或列。
在创建数据透视表之前,您需要convert your value lists to tables。
jvlzgdj93#
使用VBA可以。下面是一个小例子:
kognpnkq4#
以下是使用Excel公式的方法:
tsm1rwdh5#
一个 * 通用公式来统治它们!
结果
公式
这个公式给出了集合中每个元素的索引(有序位置),其中集合
i
的大小为n_i
。因此,如果我们有四个集合,大小将是[n_1
,n_2
,n_3
,n_4
]。使用该索引,可以只使用
index
函数从集合中选择任何属性(假设每个集合都是一个有几个列的表,可以使用index([table of the set],[this result],[column number of attribute])
)。说明
解释了公式的两个主要组成部分,循环组成部分和分配组成部分。
循环组件
=MOD([partitioning component]-1, [size of current set])+1
-1
和+1
帮助我们从基于1的编号(我们的集合索引)到zero-based编号(用于模运算)。分区组件
CEILING.MATH([index]/PRODUCT([size of set 0]:[size of previous set])
:截图
设置大小
准备集合大小,包括“Set 0”和笛卡尔积的大小。
这里,集合的大小为:
B2
中的1C2
中2D2
中有5个E2
中有3个因此,笛卡尔积的大小是30(
2*5*3
),在单元格A2
中。结果
表结构
_tbl_CartesianProduct
,包含以下列及其公式:Cartesian Index
:=IF(ROW()-ROW(_tbl_CartesianProduct[[#Headers];[Cartesian Index]])<=$A$2;ROW()-ROW(_tbl_CartesianProduct[[#Headers];[Cartesian Index]]);NA())
concatenation
:=TEXTJOIN("-";TRUE;_tbl_CartesianProduct[@[Index S1]:[Index S3]])
Index S1
:=MOD(CEILING.MATH([@[Cartesian Index]]/PRODUCT($B$2:B$2))-1;C$2)+1
Index S2
:=MOD(CEILING.MATH([@[Cartesian Index]]/PRODUCT($B$2:C$2))-1;D$2)+1
Index S3
:=MOD(CEILING.MATH([@[Cartesian Index]]/PRODUCT($B$2:D$2))-1;E$2)+1
Size prev part S1
:=PRODUCT($B$2:B$2)
Size prev part S2
:=PRODUCT($B$2:C$2)
Size prev part S3
:=PRODUCT($B$2:D$2)
Chunk S1
:=CEILING.MATH([@[Cartesian Index]]/[@[Size prev part S1]])
Chunk S2
:=CEILING.MATH([@[Cartesian Index]]/[@[Size prev part S2]])
Chunk S3
:=CEILING.MATH([@[Cartesian Index]]/[@[Size prev part S3]])
Cycle chunk in S1
:=MOD([@[Chunk S1]]-1;C$2)+1
Cycle chunk in S2
:=MOD([@[Chunk S2]]-1;D$2)+1
Cycle chunk in S3
:=MOD([@[Chunk S3]]-1;E$2)+1
a6b3iqyw6#
PowerQuery中的一些代码可以解决这个问题:
8ftvxx2r7#
尝试使用DAX
CROSS JOIN
。阅读更多MSDN可以使用表达式
CROSSJOIN(table1, table2)
创建笛卡尔积。