2015-12-15 40 views
0

我需要SQL查询来计算出每个产品组合。SQL查询来计算每个产品组合

我有一个分配给这三个类别的三个产品类别(游戏,配件,升级)和产品:

+----+------------+-----------+------------+ 
| id | category | product | prod_code | 
+----+------------+-----------+------------+ 
| 1 | game  | GTA  |  100 | 
| 2 | game  | GTA1  |  200 | 
| 3 | game  | GTA2  |  300 | 
| 4 | accessory | Play Pad |  400 | 
| 5 | accessory | Xbox Pad |  500 | 
| 6 | upgrade | Memory |  600 | 
| 6 | upgrade | drive  |  700 | 
+----+------------+-----------+------------+ 

我想借此从每个类别中的一个产品,制定出每一个组合:

+----+--------------+ 
| id | combinations | 
+----+--------------+ 
| 1 | 100,400,600 | 
| 2 | 100,500,600 | 
| 3 | 100,400,700 | 
| 4 | 100,500,700 | 
| ? | etc   | 
+----+--------------+ 

我该怎么做呢?

由于提前,司徒

+0

使用[对于XML路径](http:// sta ckoverflow.com/questions/15477743/listagg-in-sqlserver)这将组合多行为1给定组(类别)在你的情况下 – xQbert

+0

不知道我明白。 – Stuart

+0

啊我想念这个问题。当你从每个类别中选择1个时,我认为你在分类。适用于所有组合。 – xQbert

回答

3

使用CROSS JOIN

SELECT CONCAT(t1.[prod_code], ',', 
       t2.[prod_code], ',', 
       t3.[prod_code]) 
FROM (
    SELECT [prod_code] 
    FROM mytable 
    WHERE category = 'game') AS t1 
CROSS JOIN ( 
    SELECT [prod_code] 
    FROM mytable 
    WHERE category = 'accessory') AS t2 
CROSS JOIN (
    SELECT [prod_code] 
    FROM mytable 
    WHERE category = 'upgrade') AS t3 
ORDER BY t1.[prod_code], t2.[prod_code], t3.[prod_code] 

派生表的CROSS JOIN,一个用于每个类别,产生以下笛卡尔乘积:'game' products X 'accessory' products X 'upgrade' products

Demo here

+0

对于大量或不确定数量的类别,这是不可行的。 – jjt

+1

@jjt是的我知道,但OP是*明确*谈论*三个*产品类别。 –

+0

你有其他方法吗?我正在运行代码的服务器将不允许使用'concat不是公认的内置函数名称' – Stuart