Breaking News
Loading...
03/01/2014

Nối chuỗi với XML Path trong SQL Server

Hôm nay có 1 anh developer đến nhờ tôi thực hiện 1 đoạn T-SQL script. Task này khó mà diễn đạt thành lời, nhìn hình thì dễ hiểu hơn, đó là nối dữ liệu từ nhiều dòng thành 1 dòng.


Đây là toàn bộ đoạn script cho toàn bộ quá trình, tạo dữ liệu mẫu ban đầu và cho ra kết quả cuối cùng. Lưu ý là như hình minh họa ở trên, đoạn script sẽ group by theo 2 cột là USERS và ACTIVITY, với những dòng có ACTIVITY là null hoặc rỗng sẽ bị thay thế bằng giá trị 'vinh'.

DECLARE @TABLE TABLE
    (
      ID INT ,
      USERS VARCHAR(10) ,
      ACTIVITY VARCHAR(10) ,
      PAGEURL VARCHAR(10)
    )

INSERT  INTO @TABLE
VALUES  ( 1, 'Me', 'act1', 'ab' ),
        ( 2, 'Me', 'act1', 'cd' ),
        ( 3, 'You', 'act2', 'xy' ),
        ( 4, 'You', 'act2', 'st' ),
        ( 5, 'You', 'vinh', 'st' ),
        ( 6, 'You', '', 'st1' ),
        ( 7, 'You', NULL, 'st2' );
SELECT  *
FROM    @TABLE;
WITH    tbl
          AS ( SELECT   USERS ,
                        CASE WHEN Activity IS  NULL THEN 'vinh'
                             WHEN LTRIM(RTRIM(ACTIVITY)) = '' THEN 'vinh'
                             ELSE ACTIVITY
                        END AS [Activity] ,
                        PAGEURL
               FROM     @TABLE
             )
    SELECT  T1.USERS ,
            T1.ACTIVITY ,
            STUFF(( SELECT  ',' + T2.PAGEURL
                    FROM    tbl T2
                    WHERE   T1.USERS = T2.USERS
                            AND T1.ACTIVITY = T2.ACTIVITY
                  FOR
                    XML PATH('')
                  ), 1, 1, '') AS PAGEURLList
    FROM    tbl T1
    GROUP BY T1.USERS ,
            T1.ACTIVITY



Để làm được đoạn script trên, tôi đã tham khảo thông tin ở đây:
http://stackoverflow.com/questions/15154644/sql-group-by-to-combine-concat-a-column

Còn đây là 1 ví dụ khác của tác giả Pinal Dave
http://blog.sqlauthority.com/2013/04/05/sql-server-group-by-rows-and-columns-using-xml-path-efficient-concating-trick/

http://sqlknowledgebank.blogspot.com/

3 comments:

  1. =p~ =p~ =p~ =p~ =p~ =p~

    ReplyDelete
  2. I learnt a lot from this, thanks so much. Nice clear and explanations too. 검증사이트

    ReplyDelete
  3. This blog is really great. The information here will surely be of some help to me. Thanks ! 검증사이트

    ReplyDelete

 
Toggle Footer