1

ID를 기반으로하는 값으로 값을 연결하고자합니다.SQL 2012에서 다른 열의 값을 사용하여 이름을 연결하는 방법

SQL 문을 사용하여 다른 열을 기반으로 두 개의 열을 연결하는 방법이 있습니까?

내 표는 내 예상 쿼리가 결합 값에 의해 famke 이름을 만들어야합니다 별개의 ID에 대한 기본적이

customerID Name Values  FAKENAME 
1   John 10apples 10apples_20oranges_30bananas 
1   John 20oranges 
1   John 30bananas 
2   Steve 15apples 15apples_20oranges_35bananas 
2   Steve 20oranges 
2   Steve 35bananas 

처럼 나에게 어떤 것을 제공해야이

customerID Name Values 
1   John 10apples 
1   John 20oranges 
1   John 30bananas 
2   Steve 15apples 
2   Steve 20oranges 
2   Steve 35bananas 

과 같은

+0

의 사용 가능한 복제 (https://stackoverflow.com/questions/10404348/sql -server-dynamic-pivot-query) –

+0

[GROUP BY를 사용하여 SQL Server에서 문자열을 연결하는 방법]의 가능한 복제본 (https://stackoverflow.com/questions/273238/how-to-use-group-by- 연결 문자열 - in-SQL-server) –

답변

1

이것을 사용할 수 있습니다.

DECLARE @Table TABLE (CustomerID INT, Name VARCHAR(20), [Values] VARCHAR(20)) 
INSERT INTO @Table 
VALUES 
(1 ,'John','10apples'), 
(1 ,'John','20oranges'), 
(1 ,'John','30bananas'), 
(2 ,'Steve','15apples'), 
(2 ,'Steve','20oranges'), 
(2 ,'steve','35bananas') 

;WITH CTE 
    AS (
    SELECT DISTINCT 
      CustomerID, 
      Name, 
      [Values], 
      STUFF(
       (
        SELECT '_'+[Values] 
        FROM @Table T2 
        WHERE T1.CustomerID = T2.CustomerID FOR XML PATH('') 
       ), 1, 1, '') FakeName 
    FROM @Table T1) 
    SELECT CustomerID, 
      Name, 
      [Values], 
      CASE 
       WHEN(ROW_NUMBER() OVER(PARTITION BY FakeName ORDER BY FakeName)) > 1 
       THEN '' 
       ELSE FakeName 
      END FakeName 
    FROM CTE; 

결과 :

customerID Name Values  FAKENAME 
1   John 10apples 10apples_20oranges_30bananas 
1   John 20oranges 
1   John 30bananas 
2   Steve 15apples 15apples_20oranges_35bananas 
2   Steve 20oranges 
2   Steve 35bananas 
+0

내 대답이 업데이트되었습니다. –

0

이 시도 : [? SQL 서버 동적 PIVOT 쿼리]

;WITH cte0 AS(  
SELECT 1 AS CustomerID, 'John' AS [Name],'10apples' AS [Values] UNION 
SELECT 1 ,    'John'   ,'20oranges'   UNION 
SELECT 1 ,    'John'   ,'30bananas'   UNION 
SELECT 2 ,    'Steve'   ,'15strawberries'  UNION 
SELECT 2 ,    'Steve'   ,'25blueberries'  UNION 
SELECT 2 ,    'steve'   ,'35blackberries') 

,cte1 as(
SELECT customerid,[name], 
     STUFF((SELECT '_'+ [values] 
       FROM cte0 t1 
       WHERE t1.customerid = t2.customerid 
       FOR XML PATH ('')), 1, 1, '') AS FakeName 
FROM cte0 t2 
GROUP BY customerid,[name]), 

cte2 AS(
SELECT a.CustomerID,a.name,[values],fakename,Row_Number() OVER(PARTITION BY a.CustomerID ORDER BY a.CustomerID) AS RN 
FROM cte0 a 
    INNER JOIN cte1 b 
     ON a.CustomerID = b.customerid) 

SELECT CustomerID,[name],[values],CASE WHEN rn = 1 THEN FakeName ELSE '' END AS FakeName 
FROM cte2