有没有办法在Excel中执行交叉连接或笛卡尔积?

时间:2014-11-18 16:51:58

标签: sql database excel join cross-join

目前,我无法使用典型的数据库,因此暂时使用excel。有什么想法吗?

enter image description here

5 个答案:

答案 0 :(得分:4)

这里有3个维度:dim1(ABC),dim2(123),dim3(XYZ)。

以下是使用标准Excel和无VBA制作2维笛卡尔积的方法:

1)垂直绘制dim1,水平绘制dim2。连接交叉点上的维度成员:

Step 1 - plotting dimensions

2)取消数据。使用ALT-D-P启动数据透视表向导(不要按住ALT,按一次)。选择“多个合并范围” - >创建一个页面.. - >选择所有单元格(包括标题!)并将其添加到列表中,然后按下。

step2 - unpivoting data

3)垂直绘制结果并反汇编连接字符串

step 3 - disassemble strings

瞧,你有交叉加入。如果您需要添加其他维度,请再次重复此算法。

干杯,

君士坦丁。

答案 1 :(得分:1)

本文帮助我在Excel中执行交叉连接:

http://www.excelguru.ca/blog/2016/05/11/cartesian-product-joins-for-the-excel-person/

它需要Microsoft Add in Microsoft Power Query For Excel https://www.microsoft.com/en-us/download/details.aspx?id=39379

答案 2 :(得分:0)

使用VBA,你可以。这是一个小例子:

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

答案 3 :(得分:0)

这是使用数据透视表生成任意数量列表的笛卡尔积的一种非常简单的方法:

https://chandoo.org/wp/generate-all-combinations-from-two-lists-excel/

该示例适用于两个列表,但适用于任意数量的表和/或列。

在创建数据透视表之前,您需要先convert your value lists to tables

答案 4 :(得分:-5)

尝试使用CROSS JOIN。阅读更多MSDN

您可以使用表达式CROSSJOIN(table1, table2)创建笛卡尔积。