Is there a way to perform a cross join or Cartesia

2020-03-01 08:17发布

At the moment, I cannot use a typical database so am using excel temporarily. Any ideas?

The enter image description here

5条回答
仙女界的扛把子
2楼-- · 2020-03-01 08:18

This article helped me perform a cross join in Excel:

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

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

查看更多
我欲成王,谁敢阻挡
3楼-- · 2020-03-01 08:28

Try using a CROSS JOIN. Read more at MSDN

You can use the expression CROSSJOIN(table1, table2) to create a cartesian product.

查看更多
你好瞎i
4楼-- · 2020-03-01 08:32

You have 3 dimensions here: dim1 (ABC), dim2 (123), dim3 (XYZ).

Here is how you make a cartesian product of 2 dimensions using standard Excel and no VBA:

1) Plot dim1 vertically and dim2 horizontally. Concatenate dimension members on the intersections:

Step 1 - plotting dimensions

2) Unpivoting data. Launch pivot table wizard using ALT-D-P (don't hold ALT, press it once). Pick "Multiple consolidation ranges" --> create a single page.. --> Select all cells (including headers!) and add it to the list, press next.

step2 - unpivoting data

3) Plot the resulting values vertically and disassemble the concatenated strings

step 3 - disassemble strings

Voila, you've got the cross join. If you need another dimension added, repeat this algorithm again.

Cheers,

Constantine.

查看更多
爱情/是我丢掉的垃圾
5楼-- · 2020-03-01 08:38

Using VBA, you can. Here is a small example:

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
查看更多
Ridiculous、
6楼-- · 2020-03-01 08:42

Here is a very easy way to generate the Cartesian product of an arbitrary number of lists using Pivot tables:

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

The example is for two lists, but it works for any number of tables and/or columns.

Before creating the Pivot table, you need to convert your value lists to tables.

查看更多
登录 后发表回答