2017-02-21 126 views
0

我有這個表SQL查詢創建跨列

customer | product | quantity 
------------------------------- 
CLI01 | A  | 10 
CLI01 | B  | 20 
CLI02 | A  | 31 
CLI03 | A  | 10 
CLI03 | C  | 12 

,我想在SQL Server中創建這樣的輸出:

customer | crossProduct | quantity 
----------------------------------- 
CLI01 | A+B   | 30 
CLI02 | Only A  | 31 
CLI03 | B+C   | 22 

在此先感謝

尼科

+0

每2個以上的產品都有嗎? –

+0

應該是動態的 – NikoG

+0

[在Microsoft SQL Server 2005中模擬組\ _concat MySQL函數?](http://stackoverflow.com/questions/451415/simulating-group-concat-mysql-function-in-microsoft-sql -server-2005) –

回答

0

這是s的採樣:

----- Test Data ---------- 
DECLARE @TestData TABLE (customer VARCHAR(10),product VARCHAR(10),quantity INT) 
INSERT INTO @TestData 
SELECT 'CLI01','A',10 UNION ALL 
SELECT 'CLI01','B',20 UNION ALL 
SELECT 'CLI02','A',31 UNION ALL 
SELECT 'CLI03','A',10 UNION ALL 
SELECT 'CLI03 ','C',12 
----- Query ------------- 
SELECT customer,CASE WHEN COUNT(DISTINCT t.product)=1 THEN 'Only ' ELSE '' END + LEFT(c.product,LEN(c.product)-1) AS Product,SUM(quantity) AS quantity 
FROM @TestData AS t 
CROSS APPLY(SELECT a.product+'+' FROM @TestData AS a WHERE a.customer=t.customer FOR XML PATH('')) c(product) 
GROUP BY customer,c.product 
ORDER BY t.customer 
 
customer Product quantity 
CLI01 A+B 30 
CLI02 Only A 31 
CLI03 A+C 22 
1

如果你只關心兩個產品,那麼這是簡單的聚合:

select customer, 
     (case when count(distinct product) > 2 then 'Lots of Products' 
      when min(product) = max(product) then 'Only ' + min(product) 
      else min(product) + '+' + max(product) 
     end) as crossproduct, 
     sum(quantity) 
from t 
group by customer; 

如果你關心兩個以上的產品,那麼你需要做聚合字符串連接。這在SQL Server中有點痛苦。通過谷歌搜索「sql server聚合字符串連接」開始。

0

您是否嘗試過使用的東西?這會給你你需要的。從SQL 2008開始,可以根據需要使用盡可能多的產品。

CREATE TABLE x (customer VARCHAR (20), product CHAR(1), quantity INT) 
INSERT INTO x 
    VALUES('CLI01', 'A', 10), 
     ('CLI01', 'B', 20), 
     ('CLI02', 'A', 31), 
     ('CLI03', 'A', 10), 
     ('CLI03', 'C', 12) 

SELECT x1.customer, x3.Products, SUM(x1.quantity) 
FROM x x1 
     CROSS APPLY (SELECT Products = STUFF((select '+' + product AS [text()] 
         FROM x x2 
         WHERE x2.customer = x1.customer 
         FOR XML PATH ('')), 1, 1,'')) x3 
GROUP BY x1.customer, x3.Products 
+0

謝謝你們。 史蒂夫你查詢它是完美的。我已將2 DISTINCT添加到CROSS APPLY中。 – NikoG

+0

對不起史蒂夫,但如果我想設置'+'? – NikoG