簡體   English   中英

將多個記錄(行)合並為單個記錄(行)

[英]Combining the multiple records(rows) into single record(row)

我試圖將多行合並為單行,我能夠得到其中的一半,我嘗試了多種方式來獲得剩余的一半,以下是我編寫的sql。 任何幫助將不勝感激。

DROP TABLE #TEST_DEPT_NAME 

CREATE TABLE #TEST_DEPT_NAME ([ID] [varchar](255) NULL,[CSN_ID] [varchar](50) NULL,[NOTE_ID] [varchar](50) NULL,[DEPARTMENT_NAME] [varchar](255) NULL,
[NOTE_CSN_ID] [varchar](50) NULL,[LINE] [varchar](50) NULL,[NOTE_TEXT] [nvarchar](max) NULL,[AUTHOR_USER_ID] [varchar](50) NULL,[AUTHOR_USER_NAME] [varchar](255) NULL,
[NOTE_TYPE_NAME] [varchar](255) NULL,[IS_ARCHIVED_YN] [varchar](255) NULL,[NOTE_STATUS_NAME] [varchar](255) NULL)

INSERT INTO #TEST_DEPT_NAME
VALUES ('123456','1234567','12345678' ,'TEST','001234' ,1 ,'NOTES_1.1' ,'1234','TEST','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','001234' ,1 ,'NOTES_1.1.1' ,'1234','TEST','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','0012345' ,2 ,'NOTES_1.2' ,'999999','TEST 1','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','00123456' ,3 ,'NOTES_1.3' ,'999999','TEST 1','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','66666' ,1 ,'NOTES_2.1' ,'1234','TEST','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','66666' ,2 ,'NOTES_2.2' ,'1234','TEST','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','66666' ,3 ,'NOTES_2.3' ,'1234','TEST','Clinic Note','N','Signed')


SELECT distinct  ID,[CSN_ID],[NOTE_ID],[DEPARTMENT_NAME],[NOTE_TYPE_NAME],[IS_ARCHIVED_YN]
,[NOTE_TEXT] =  (select ' '+ case when [NOTE_TEXT]= ''  then null else [NOTE_TEXT]end   from  #TEST_DEPT_NAME P1 
WHERE P1.[ID] = P2.[ID]AND P1.[CSN_ID] =P2.[CSN_ID] AND P1.NOTE_ID = P2.NOTE_ID AND P1.DEPARTMENT_NAME = P2.DEPARTMENT_NAME
AND P1.LINE = P2.LINE AND P1.NOTE_TYPE_NAME =P2.NOTE_TYPE_NAME AND P1.NOTE_CSN_ID = P2.NOTE_CSN_ID AND P1.IS_ARCHIVED_YN =P2.IS_ARCHIVED_YN  FOR XML PATH(''))
FROM #TEST_DEPT_NAME  P2 WHERE [ID] = '123456' 
GROUP BY ID,CSN_ID,[NOTE_ID],[DEPARTMENT_NAME],[NOTE_TYPE_NAME],[IS_ARCHIVED_YN],LINE,NOTE_CSN_ID

當我在SQL上運行時,我得到如下結果集

ID       CSN_ID  NOTE_ID    DEPARTMENT_NAME    NOTE_TEXT
123456  1234567 12345678    TEST               NOTES_1.1 NOTES_1.1.1
123456  1234567 12345678    TEST               NOTES_1.2
123456  1234567 12345678    TEST               NOTES_1.3
123456  1234567 12345678    TEST               NOTES_2.1
123456  1234567 12345678    TEST               NOTES_2.2
123456  1234567 12345678    TEST               NOTES_2.3

但我想要如下所示的結果

ID      CSN_ID  NOTE_ID     DEPARTMENT_NAME    NOTE_TEXT
123456  1234567 12345678    TEST               NOTES_1.1 NOTES_1.1.1 NOTES_1.2 NOTES_1.3
123456  1234567 12345678    TEST               NOTES_2.1 NOTES_2.2  NOTES_2.3

我的假設是這是foley數據,並且Note_Text的值實際上將是用戶輸入的長格式注釋。 note_csn_id字段中的值以及Group中包含Line的值將導致查詢分離出單獨的“ Note_1”記錄。

您的查詢在#test_dept_name中產生以下結果:

ID      CSN_ID      NOTE_ID     DEPARTMENT_NAME     NOTE_CSN_ID     LINE    NOTE_TEXT       AUTHOR_USER_ID  AUTHOR_USER_NAME    NOTE_TYPE_NAME  IS_ARCHIVED_YN  NOTE_STATUS_NAME
123456  1234567     12345678    TEST                1234            1       NOTES_1.1       1234            TEST                Clinic Note     N               Signed
123456  1234567     12345678    TEST                1234            1       NOTES_1.1.1     1234            TEST                Clinic Note     N               Signed
123456  1234567     12345678    TEST                12345           2       NOTES_1.2       999999          TEST 1              Clinic Note     N               Signed
123456  1234567     12345678    TEST                123456          3       NOTES_1.3       999999          TEST 1              Clinic Note     N               Signed
123456  1234567     12345678    TEST                66666           1       NOTES_2.1       1234            TEST                Clinic Note     N               Signed
123456  1234567     12345678    TEST                66666           2       NOTES_2.2       1234            TEST                Clinic Note     N               Signed
123456  1234567     12345678    TEST                66666           3       NOTES_2.3       1234            TEST                Clinic Note     N               Signed

請注意,注釋行更改時,note_csn_id也會更改。 因為您有單獨的行號,所以這可能是多余的行為。 我們可以通過以下方式使查詢如您所願:

  • 更改group by子句以僅考慮note_csn_id的前X個字符(通常是個壞主意,因為id字段的長度趨於增長)
  • 更改note_csn_id的填充方式,使其在每個注釋組中都是唯一的(如果您可以控制note_csn_id的填充方式,則更好的主意)

無論哪種情況,您都需要從子選擇中刪除Line上的join,並從group by子句中刪除line。

如果您能夠更改note_csn_id的填充方式,如下所示:

INSERT INTO #TEST_DEPT_NAME
VALUES ('123456','1234567','12345678' ,'TEST','001234' ,1 ,'NOTES_1.1' ,'1234','TEST','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','001234' ,1 ,'NOTES_1.1.1' ,'1234','TEST','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','001234' ,2 ,'NOTES_1.2' ,'999999','TEST 1','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','001234' ,3 ,'NOTES_1.3' ,'999999','TEST 1','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','66666' ,1 ,'NOTES_2.1' ,'1234','TEST','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','66666' ,2 ,'NOTES_2.2' ,'1234','TEST','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','66666' ,3 ,'NOTES_2.3' ,'1234','TEST','Clinic Note','N','Signed')

然后,您可以將選擇更改為以下內容:

SELECT distinct  
ID,
[CSN_ID],
[NOTE_ID],
[DEPARTMENT_NAME],
[NOTE_TYPE_NAME],
[IS_ARCHIVED_YN],
[NOTE_TEXT] =  (select ' '+ case when [NOTE_TEXT]= ''  then null else [NOTE_TEXT]end   from  #TEST_DEPT_NAME P1 
WHERE P1.[ID] = P2.[ID]AND P1.[CSN_ID] =P2.[CSN_ID] AND P1.NOTE_ID = P2.NOTE_ID AND P1.DEPARTMENT_NAME = P2.DEPARTMENT_NAME
 AND P1.NOTE_TYPE_NAME =P2.NOTE_TYPE_NAME AND P1.NOTE_CSN_ID = P2.NOTE_CSN_ID AND P1.IS_ARCHIVED_YN =P2.IS_ARCHIVED_YN  FOR XML PATH(''))

FROM #TEST_DEPT_NAME  P2 WHERE [ID] = '123456' 

GROUP BY ID,CSN_ID,[NOTE_ID],[DEPARTMENT_NAME],[NOTE_TYPE_NAME],[IS_ARCHIVED_YN],NOTE_CSN_ID

並得到以下結果:

ID      CSN_ID  NOTE_ID     DEPARTMENT_NAME NOTE_TYPE_NAME  IS_ARCHIVED_YN  NOTE_TEXT
123456  1234567 12345678    TEST            Clinic Note     N                NOTES_1.1 NOTES_1.1.1 NOTES_1.2 NOTES_1.3
123456  1234567 12345678    TEST            Clinic Note     N                NOTES_2.1 NOTES_2.2 NOTES_2.3

您可以通過對group by使用leftstuff函數來做到這一點:

select t.ID ,t.CSN_ID,t.NOTE_ID,t.DEPARTMENT_NAME,
       STUFF((
        select ' ' + t1.NOTE_TEXT
        from #TEST_DEPT_NAME t1
        where t.ID =t1.ID  and t.CSN_ID=t1.CSN_ID and t.NOTE_ID=t1.NOTE_ID
              and t.DEPARTMENT_NAME=t1.DEPARTMENT_NAME 
              and left(t.NOTE_TEXT,8)=left(t1.NOTE_TEXT,8)
        for xml path(''), type
    ).value('.', 'varchar(max)'), 1, 1, '') NOTE_TEXT_
from #TEST_DEPT_NAME t
group by t.ID ,t.CSN_ID,t.NOTE_ID,t.DEPARTMENT_NAME,left(t.NOTE_TEXT,8)

輸出:

ID      CSN_ID  NOTE_ID     DEPARTMENT_NAME NOTE_TEXT_
123456  1234567 12345678    TEST            NOTES_1.1 NOTES_1.1.1 NOTES_1.2 NOTES_1.3
123456  1234567 12345678    TEST            NOTES_2.1 NOTES_2.2 NOTES_2.3

編輯:如果您有9個以上的NOTE_TEXT我的意思是NOTES_1..,NOTES_2...,NOTES_10...,NOTES_100...那么您必須使用charindex('.',t.NOTE_TEXT)而不是上面查詢中的8

select t.ID ,t.CSN_ID,t.NOTE_ID,t.DEPARTMENT_NAME,
       STUFF((
        select ' ' + t1.NOTE_TEXT
        from #TEST_DEPT_NAME t1
        where t.ID =t1.ID  and t.CSN_ID=t1.CSN_ID and t.NOTE_ID=t1.NOTE_ID
              and t.DEPARTMENT_NAME=t1.DEPARTMENT_NAME 
              and left(t.NOTE_TEXT,charindex('.',t.NOTE_TEXT))
                  =left(t1.NOTE_TEXT,charindex('.',t1.NOTE_TEXT))
        for xml path(''), type
    ).value('.', 'varchar(max)'), 1, 1, '') NOTE_TEXT_
from #TEST_DEPT_NAME t
group by t.ID ,t.CSN_ID,t.NOTE_ID,t.DEPARTMENT_NAME,
         left(t.NOTE_TEXT,charindex('.',t.NOTE_TEXT))

我認為此查詢是所需的查詢:

SELECT distinct  ID,[CSN_ID],[NOTE_ID],[DEPARTMENT_NAME],[NOTE_TEXT] =
(
select ' '+ case when [NOTE_TEXT]= ''  then null else [NOTE_TEXT]end
from  #TEST_DEPT_NAME P1 
WHERE P1.[ID] = P2.[ID]
AND P1.[CSN_ID] =P2.[CSN_ID] 
AND P1.NOTE_ID = P2.NOTE_ID 
AND P1.DEPARTMENT_NAME = P2.DEPARTMENT_NAME
AND P1.NOTE_TYPE_NAME =P2.NOTE_TYPE_NAME 
AND P1.IS_ARCHIVED_YN =P2.IS_ARCHIVED_YN  
AND SUBSTRING(P1.NOTE_TEXT, 0, CHARINDEX('.', P1.NOTE_TEXT)) = SUBSTRING(P2.NOTE_TEXT, 0, CHARINDEX('.', P2.NOTE_TEXT))
FOR XML PATH('')
)
FROM #TEST_DEPT_NAME  P2 WHERE [ID] = '123456' 
GROUP BY ID,CSN_ID,[NOTE_ID],[DEPARTMENT_NAME],[NOTE_TYPE_NAME],[IS_ARCHIVED_YN],LINE,NOTE_CSN_ID,SUBSTRING([NOTE_TEXT], 0, CHARINDEX('.', [NOTE_TEXT]))

結果:

ID      CSN_ID  NOTE_ID     DEPARTMENT_NAME    NOTE_TEXT
123456  1234567 12345678    TEST               NOTES_1.1 NOTES_1.1.1 NOTES_1.2 NOTES_1.3
123456  1234567 12345678    TEST               NOTES_2.1 NOTES_2.2  NOTES_2.3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM