2017-12-18 124 views
0

我有问题选择由GROUP BY子句生成的多个值。 我尝试建立什么,我有一个简单的例子:子查询与组中的每个值 - 由

Table CUSTOMERS Table PRODUCTS   Table ORDERS 
ID | NAME   ID | DESCR | PROMO   ID_P | ID_C 
---+---------  ---+-------+-------  -----+----- 
1 | Alice   1 | prod1 | gold   1 | 1 
2 | Bob   2 | prod2 | gold   2 | 3 
3 | Charlie  3 | prod3 | silver   1 | 2 
        4 | prod4 | silver   3 | 1 

从这个我LIK加入每一个产品和每一个客户在一个单元

Results 
PROMO | products  | CUSTOMERS 
-------+--------------+-------------------- 
gold | prod1, prod2 | Alice, Bob, Charlie 
silver | prod3  | Alice 

喜欢的东西:

SELECT PRODUCTS.PROMO 
    , CONCAT(PRODUCTS.DESCR) 
    , STUFF(
     (SELECT '/' + CUSTOMERS.NAME 
      FROM CUSTOMERS 
      WHERE CUSTOMERS.ID = ORDERS.ID 
      FOR XML PATH ('')) 
     , 1, 3, '') 
FROM  PRODUCTS 
INNER JOIN ORDERS 
ON PRODUCTS.ID = ORDERS.ID_P 
WHERE PRODUCTS.ID < 3 
GROUP BY PRODUCTS.PROMO 

这可以在SQL中实现吗?

+0

https://stackoverflow.com/questions/451415/simulating-group-concat-mysql-function-in-microsoft-sql-server-2005 – jarlh

+0

@jarlh:谢谢,我从那篇文章开始,但是我得到那个CUSTOMER.NAME在选择列表中无效,因为它不包含在GROUP BY中,但我不想按客户或产品进行分组。 – dg3

回答

1

您可以使用它。

DECLARE @CUSTOMERS Table(ID INT, NAME VARCHAR(20)) 
INSERT INTO @CUSTOMERS VALUES 
(1 ,'Alice'),    
(2 ,'Bob'),    
(3 ,'Charlie')    

DECLARE @PRODUCTS TABLE (ID INT, DESCR VARCHAR(10), PROMO VARCHAR(10)) 
INSERT INTO @PRODUCTS VALUES 
(1 ,'prod1','gold'), 
(2 ,'prod2','gold'), 
(3 ,'prod3','silver'), 
(4 ,'prod4','silver') 

DECLARE @ORDERS TABLE ( ID_P INT, ID_C INT) 
INSERT INTO @ORDERS VALUES 
( 1 ,1), 
( 2 ,3), 
( 1 ,2), 
( 3 ,1) 


;WITH CTE AS (
SELECT O.*, P.PROMO, P.DESCR, C.NAME FROM @ORDERS O 
INNER JOIN @PRODUCTS P ON O.ID_P = P.ID 
INNER JOIN @CUSTOMERS C ON O.ID_C = C.ID 
) 
SELECT DISTINCT T.PROMO, 
    STUFF(Product.Descrs,1,1,'') products, 
    STUFF(Customer.Names,1,1,'') CUSTOMERS 
FROM CTE T 
    CROSS APPLY (SELECT DISTINCT ',' + T1.DESCR FROM CTE T1 WHERE T.PROMO = T1.PROMO FOR XML PATH('')) AS Product(Descrs) 
    CROSS APPLY (SELECT DISTINCT ',' + T1.NAME FROM CTE T1 WHERE T.PROMO = T1.PROMO FOR XML PATH('')) AS Customer(Names) 

结果:

PROMO  products  CUSTOMERS     
---------- -------------- ------------------------- 
gold  prod1,prod2 Alice,Bob,Charlie 
silver  prod3   Alice 
+0

谢谢!我想我必须学习CROSS APPLY! – dg3