簡體   English   中英

如何將多行合並為一列,在 t-sql 中獲得與逗號分隔值不同的一列?

[英]How to combine multiple rows into one ,getting the one column that differs as comma separated values in t-sql?

我想將多行合並為一,得到不同的一列作為逗號分隔值。

我已經編寫了以下查詢,它給出的結果如下所示。 我想要 4 行而不是 9 行,最后一列應該以逗號分隔,如(存儲、廢水、雜項)。

請幫助您的想法,在此先感謝!

SELECT DISTINCT
    C.CONTRACTID, C.NUMBER, C.STATE,  
    O.CUSTOMERCODE, O.CUSTOMERNAME,
    C.STARTDATE, C.TERMINATIONDATE, CT.Name AS CONTRACTTYPELIST
FROM  
    [DBO].[CONTRACT] C  
INNER JOIN  
    [ORD].[ORDER] O ON C.CUSTOMERID = O.CUSTOMERID 
INNER JOIN
    [dbo].[Contract_ContractType] CCT ON CCT.ContractId =  C.ContractId
INNER JOIN 
    [Ref].[ContractType] CT ON CT.ContractTypeId = CCT.ContractTypeId
WHERE 
    O.ORDERSTATEID = 6 
ORDER BY 
    c.ContractId

在此處輸入圖像描述

我像下面這樣更新了查詢,但它在最后一列中給出了長字符串,但我只想要一行中該特定記錄 id 的值。 如何糾正?

SELECT distinct 
   C.CONTRACTID,C.NUMBER, C.STATE , 
   O.CUSTOMERCODE,O.CUSTOMERNAME ,
   C.STARTDATE , C.TERMINATIONDATE ,
   STRING_AGG(CAST(CT.Name AS NVARCHAR(MAX)) , ',') AS CONTRACTTYPELIST
FROM 
  [DBO].[CONTRACT] C  
INNER JOIN 
  [ORDERING].[ORDER] O ON C.CUSTOMERID = O.CUSTOMERID 
INNER JOIN
   [dbo].[Contract_ContractType] CCT on CCT.ContractId =  C.ContractId
INNER  JOIN 
   [Ref].[ContractType] CT on CT.ContractTypeId = CCT.ContractTypeId
WHERE 
   O.ORDERSTATEID =  6 
GROUP BY  
C.CONTRACTID,C.NUMBER, C.STATE  , 
O.CUSTOMERCODE,O.CUSTOMERNAME ,
C.STARTDATE , C.TERMINATIONDATE

在此處輸入圖像描述

您想將GROUP BY子句與STRING_AGG function 一起使用

例子:

SELECT STRING_AGG(column_D, ',')
FROM dbo.table
GROUP BY column_A, column_B, column_C

在子查詢中使用 DISTINCT 包裝查詢。
然后在外部查詢中使用 STRING_AGG。

SELECT 
  CONTRACTID, [NUMBER], STATE, 
  CUSTOMERCODE, CUSTOMERNAME,
  STARTDATE, TERMINATIONDATE,
  STRING_AGG(CONTRACTTYPE,',') AS CONTRACTTYPELIST
FROM
(
    SELECT DISTINCT
      C.CONTRACTID, C.NUMBER, C.STATE, 
      O.CUSTOMERCODE, O.CUSTOMERNAME,
      C.STARTDATE, C.TERMINATIONDATE,
      CT.Name AS CONTRACTTYPE
    FROM 
      [DBO].[CONTRACT] C  
    JOIN [ORDERING].[ORDER] O 
      ON C.CUSTOMERID = O.CUSTOMERID 
    JOIN [dbo].[Contract_ContractType] CCT 
      ON CCT.ContractId =  C.ContractId
    JOIN [Ref].[ContractType] CT 
      ON CT.ContractTypeId = CCT.ContractTypeId
    WHERE 
       O.ORDERSTATEID =  6 
) q
GROUP BY  
  CONTRACTID, [NUMBER], STATE, 
  CUSTOMERCODE, CUSTOMERNAME,
  STARTDATE, TERMINATIONDATE

暫無
暫無

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

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