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

カンマ区切りの値が必要で、金額列にgroupby句を使用したい。

現在私がしていることは次のとおりです。

    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
4

2 に答える 2

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 =" のネストされたクエリ コードは、group by で実行されます。クエリの残りの部分が構造化されている方法を考えると、より一貫した外観が気に入っています。

CSV リストについては、並べ替え方法を指定していません。ここでは値 (ORDER BY CD.CNT など) で並べ替えましたが、これを任意の順序に変更できます。同様に、CSV 値の間にスペースはありません。select ',' を変更してそこにスペースを入れ、パラメータを STUFF コマンドに変更することで、これを微調整できます (2 番目の 1 を 2 に変更します)。

基本的に、FOR XML PATH('') ビットは、指定されたミニ結果セットを取得し、XML リテラルのないテキストを返します ('' のため)。これは、XML PATH 結果の先頭にある先頭の , を削除するために STUFF を使用して整理されています。

お役に立てれば!:)

于 2012-12-10T13:06:00.263 に答える
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]

価格の問題でグループをチェックしていません.. !!

于 2012-12-10T13:09:46.450 に答える