2017-11-27 2 views
0

나는 일반적으로 group_concat이라는 쿼리가 있습니다. dbo.group_concat에 질의 결과를 3 쌍으로 쌍을 이룰 수 있는지 알아야합니다 (예를 들어). 예를 들어Group_Concat (nth 쌍)

는 : 결과

Size Pattern Mass 
----------------------------------------------------------- 
234 ZYL  22.43,55.32,33.24,22.53,56.32,40.32,50.21,32.21 
234 ZA  50.00,56.23,21.23,50.21 

나는 우리가 group ID 열이있는 경우 이것은 쉽게 수행 할 수 있습니다

Size Pattern Mass 
-------------------------------- 
234 ZYL  22.43,55.32,33.24 
234 ZYL  22.53,56.32,40.32 
234 ZYL  50.21,32.21 
234 ZA  50.00,56.23,21.23 
234 ZA  50.21 
+0

뒤에있는 논리는 무엇입니까? 그런 기능이 SSMS라고 생각하지 않습니다 ... –

+0

'GROUP BY'조건을 원하는대로 변경하십시오. – Alex

+0

MySQL을 사용하고 있습니까? – gotqn

답변

0

이 결과를 가지고 싶습니다

select size, pattern, dbo.group_concat(mass) mass 
from labels 
group by size, pattern 

입니다

. 이 열은 3 자당 행을 그룹화하고 데이터를 [mass] 값으로 정렬합니다. 우리는 그런 칼럼을 가지고 있지 않기 때문에 칼럼을 계산해야합니다. 등의 단계는 다음과 같습니다 : 우리는 우리가 재귀 공통 테이블 표현식 (너무 복잡 아무것도)를 사용하는 행을 정렬 세 결과 행이
  • 다음 그룹을 형성하는 알고 ROW_NUMBER 기능을 사용하는

    1. - 단지

      DECLARE @DataSource TABLE 
      (
          [size] VARCHAR(12) 
          ,[pattern] VARCHAR(12) 
          ,[mass] DECIMAL(9,2) 
      ); 
      
      
      INSERT INTO @DataSource ([size], [pattern], [mass]) 
      VALUES (234, 'ZYL', 22.43) 
           ,(234, 'ZYL', 55.32) 
           ,(234, 'ZYL', 33.24) 
           ,(234, 'ZYL', 22.53) 
           ,(234, 'ZYL', 56.32) 
           ,(234, 'ZYL', 40.32) 
           ,(234, 'ZYL', 50.21) 
           ,(234, 'ZYL', 32.21) 
           -- 
           ,(234, 'ZA', 50.00) 
           ,(234, 'ZA', 56.23) 
           ,(234, 'ZA', 21.23) 
           ,(234, 'ZA', 50.21); 
      
      WITH DataSource AS 
      (
          SELECT * 
            ,ROW_NUMBER() OVER (PARTITION BY [size], [pattern] ORDER BY [mass]) AS [RowID] 
          FROM @DataSource 
      ), 
      RecursiveDataSource AS 
      (
          SELECT [size], [pattern], [mass], [RowID] 
            ,1 AS [Group] 
          FROM DataSource 
          WHERE [RowID] = 1 
          UNION ALL 
          SELECT A.* 
            ,R.[Group] + CASE WHEN (A.[rowID] - 1) % 3 = 0 THEN 1 ELSE 0 END 
          FROM DataSource A 
          INNER JOIN RecursiveDataSource R 
           ON A.[size] = R.[size] 
           AND A.[pattern] = R.[pattern] 
           AND A.[RowID] - 1 = R.[rowID] 
      ) 
      SELECT * 
      FROM RecursiveDataSource 
      ORDER BY [pattern], [RowID]; 
      
      012 : 우리가 그들에게 위의 모든

    이 가득 작업 예제를 얻을 때까지, 다음에 가입 ... 각 size, pattern 개체의 첫 번째 행을 받고 다음 다음 행에 합류 3,516,

    enter image description here

    지금, 최종 SELECT에 우리는 당신의 초기 코드를 추가해야 할뿐만 아니라 [group] 열을 기준으로 그룹화 :

    내 시스템에서
    SELECT [size], [pattern], [dbo].[group_concat] ([mass]) 
    FROM RecursiveDataSource 
    GROUP BY [size], [pattern], [Group]; 
    

    , 위의 수율이 :

    enter image description here

    일부 고려 사항 :

    • 값을 mass 값으로 주문하고 있습니다 (귀하의 예에서는 그렇지 않습니다). 이는 전적으로 귀하에게 달려 있습니다. ROW_NUMBER 함수의 ORDER BY 절에있는 SELECT 1 함수를 사용하여 순서에 관계없이 임의의 순서를 변경할 수 있습니다.
    • 큰 테이블에 대해 재귀 CTE를 사용하면 성능이 저하 될 수 있습니다. 먼저 실제 데이터로 코드를 테스트했는지 확인하십시오.
    • concatenate 내 시스템의 SQL CLR 기능으로 설정 순서가 가능합니다. 내 경우에는 RowID 값을 사용하여 행을 연결했습니다. 함수가 이러한 순서 지정을 허용하지 않으면 그 뒤에있는 .net 코드에 의존하므로 최종 CSV 목록에서 다른 순서의 값을 얻을 수 있습니다.
  • +0

    고마워요. 100 % 효과가 있어요. 고맙습니다. 노력을 해주셔서 감사합니다. –

    +0

    @PieterHenkelman https://meta.stackexchange.com/a/5235/201336 답변을 수락하십시오. – gotqn