2012-12-10 3 views
0
을 저장하여

무엇 내가 현재 가지고 것은 :쉼표로 구분 된 값이 과정

COUNT DETAILS: 
CNT DTLID  COUNT   TOTAL QTY  UNITPRICE   AMOUNT 
1    234     2222   1.20     32 
1    12     123   2      21 


What i want it to be like 
CNT DTLID  COUNT   TOTAL QTY   UNITPRICE   AMOUNT 
1    234,12   2222 , 123  1.20,2    32 + 21 = 53 

나는 쉼표로 구분 된 값을 갖고 싶어하고 또한 양 열에 대한 GROUP BY 절을 사용하려고합니다.

현재 난`는 개까지 무엇 :

ALTER PROCEDURE [dbo].[sp_Tbl_CountDetail_SelectAll] 
    -- Add the parameters for the stored procedure here 

AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 

    select * from Tbl_CountDetail 
    inner join tbl_Contract 
    on 
    tbl_CountDetail.ContractID = tbl_Contract.ContractID 
    inner join tbl_Count 
    on 
    tbl_CountDetail.CountID = tbl_Count.CountID 
    where tbl_CountDetail.isDeleted = 0 
    and tbl_Contract.isdeleted = 0 
END 

답변

0

일부 친화적 인 샘플 데이터

create table #CountDetails 
(
DTLID int, 
CNT int, 
Qty int, 
UnitPrice money, 
Amount int 
) 

insert into #CountDetails 
SELECT 
1, 234, 2222, 1.20, 32 
UNION ALL SELECT 
1, 12, 123, 2, 21 

다음은이를 조정할 수있는 여러 가지 방법이 있습니다

SELECT 
    DTLIDs.DTLID, 

    CNTs = 
     ISNULL(
      STUFF(
       (
        select ',' + 
         cast(CD.cnt as varchar(50)) 
        from #CountDetails CD 
        where CD.DTLID = DTLIDs.DTLID 
        order by CD.CNT 
        FOR XML PATH('') 
       ), 
       1, 1, '' --removes the leading ',' 
      ), 
      '' 
     ), 

    QTYs = 
     ISNULL(
      STUFF(
       (
        select ',' + 
         cast(CD.qty as varchar(50)) 
        from #CountDetails CD 
        where CD.DTLID = DTLIDs.DTLID 
        order by CD.Qty 
        FOR XML PATH('') 
       ), 
       1, 1, '' --removes the leading ',' 
      ), 
      '' 
     ), 

    UnitPrices = 
     ISNULL(
      STUFF(
       (
        select ',' + 
         cast(CD.UnitPrice as varchar(50)) 
        from #CountDetails CD 
        where CD.DTLID = DTLIDs.DTLID 
        order by CD.UnitPrice 
        FOR XML PATH('') 
       ), 
       1, 1, '' --removes the leading ',' 
      ), 
      '' 
     ), 

    AmountSum = 
    (
     select SUM(Amount) from #CountDetails CD 
     where CD.DTLID = DTLIDs.DTLID 
    ) 

from (
    select distinct DTLID from #CountDetails 
    ) DTLIDs 

일부 코드입니다. 예를 들어, "AmountSum ="중첩 된 쿼리 코드는 그룹에 대해 수행됩니다. 나머지 쿼리가 구조화되는 방식에 따라 일관성있는 모양을 선호합니다.

CSV 목록의 경우 정렬 방법을 지정하지 않았습니다. 값으로 주문했는데 (예 : CD.CNT 주문) 원하는대로 주문할 수 있습니다. 마찬가지로 CSV 값 사이에는 공백이 없습니다. 선택 ','을 변경하여 STUFF 명령의 매개 변수와 매개 변수를 변경할 수 있습니다 (두 번째 1을 2로 변경).

기본적으로 FOR XML PATH ('') 비트는 주어진 미니 결과 집합을 취해 XML 리터럴이없는 텍스트를 반환합니다 ('로 인해). 이것은 XML PATH 결과의 시작 부분에서 STUFF를 사용하여 행간을 제거하기 위해 정리됩니다.

희망이 도움이됩니다. :)

+0

입력 한 선택 문구가 제공 한 샘플 데이터와 일치하지 않는 것 같습니다. 내 대답을 할 때 귀하의 질문을 무시했습니다 ... 제발 맞게 개조하십시오. –

+0

이 저장 프로 시저 또는 함수입니까? 이 기능을 작성해야합니까? –

0

은 .... 이런 식으로 뭔가를 할 수

DECLARE @VALUES NVARCHAR(1000),@UnitPrice nvarchar(100) 
SELECT @VALUES = COALESCE(@VALUES + ',','') + CAST(COUNTQty AS NVARCHAR(50)), 
@UnitPrice = COALESCE(@UnitPrice + ',','') + CAST(UnitPrice AS NVARCHAR(50)) FROM tableName 
SELECT @VALUES as [CountQty],@Ids as [UnitPrice] 

가격 문제로 그룹을 확인하지 않았 .. !!