2017-02-21 4 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 

Заранее спасибо

Niko

+0

Есть ли еще 2 продукта? –

+0

Должен быть динамическим – NikoG

+0

Возможный дубликат функции [Имитация группы \ _concat MySQL в Microsoft SQL Server 2005?] (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. Начните с Googling «Объединение строк в sql-сервере».

0

Вы пробовали использовать материал? Это даст вам то, что вам нужно. Работает с как можно большим количеством продуктов, начиная с 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

Благодарю вас, ребята. steve вы спрашиваете, что это прекрасно. Я добавлю 2 DISTINCT в CROSS APPLY. – NikoG

+0

извините Стив, но если я хочу установить '+'? – NikoG