0

以下の手順を実行すると、返された結果セットは次のようになります

私の結果セット

結果セット 2 しかし、実際にはシナリオによると、@ContractId パラメーターに対して単一のレコードが必要です。したがって、結果セットが返す行をマージしたいと思います。

PS: この画像はいくつかの列のみを示しています。異なる値を持つ他の列もいくつか存在します。

これは私の手順です:

ALTER PROCEDURE [dbo].[sp_Tbl_Contract_SearchOne]
    -- Add the parameters for the stored procedure here
    @ContractID int
AS
BEGIN

    select  
    tbl_Contract.ContractID,
    KeyWinCountNumber, 
    ItemName,
    BrandName,
    CountName,
    SellerName,
    BuyerName,
    ContractNumber,
    ContractDate,
    CountryFromName,
    CountryToName,
    TotalQty,
    Vans,
    UnitPrice,
    Amount
    from tbl_Contract

    inner join tbl_CountDetail
    on
    tbl_CountDetail.ContractID = Tbl_Contract.ContractID
    inner join tbl_Count tcount
    on
    tcount.CountID = tbl_CountDetail.CountID
    INNER JOIN Tbl_Item
    on Tbl_Contract.ItemID = Tbl_Item.ItemID 
    INNER JOIN Tbl_Brand
    on Tbl_Contract.BrandID = Tbl_Brand.BrandID
    INNER JOIN Tbl_Seller
    on Tbl_Contract.SellerID = Tbl_Seller.SellerID
    INNER JOIN Tbl_Buyer 
    on Tbl_Contract.BuyerID = Tbl_Buyer.BuyerID
    INNER JOIN Tbl_CountryFrom
    ON Tbl_Contract.CountryFromID=Tbl_CountryFrom.CountryFromID
    INNER JOIN Tbl_CountryTo 
    ON Tbl_Contract.CountryToID = Tbl_CountryTo.CountryToID
    inner join tbl_CostUnit
    on Tbl_Contract.CostUnitID = tbl_CostUnit.CostUnitID    
    where Tbl_Contract.ContractID = 1
    and Tbl_Contract.IsDeleted = 0 and tbl_CountDetail.IsDeleted = 0
END
4

2 に答える 2

1

これは集約に該当します。多くの場合、集約とは、単一の行に圧縮する行に対して操作(合計、平均、標準偏差)を実行することを意味します。たとえば、データが1日1人あたりのCookie販売数で構成されている場合:

day    person    sales
======================
1      Bob       5
1      Jane      8
2      Bob       2
2      Jane      10

そして、あなたは一日中、一人当たりの総売上高が何であるかを見たいと思っていました、あなたは選択personsum(sales)、人によるグループ化をします

select  
   person
   sum(sales)
from salesData
group by person

文字ベースまたは英数字のファイルを集約しようとしているという点で、あなたのケースはやや標準的ではありません。これは、文字フィールドで機能する集計がいくつかあるという点で、問題ありません。MINwilのように、引き続き機能しますMAX-それぞれ最初と最後のフィールドを返します。

つまり、minセットaに対してオーバーを実行するとb、、が最初の状態でc返さaれます(文字列の順序付け規則によって最小順序付けされます)。他にもいくつかの数値フィールド(、、)があるようAmountですUnitPrice-TotalQtyこれらは正しい集計を選択できます-SUMおそらく

だからあなたはこれを行うことができます:

select  
    tbl_Contract.ContractID,
    KeyWinCountNumber, 
    ItemName,
    BrandName,
    MIN(CountName) as FirstCountName,
    SellerName,
    BuyerName,
    ContractNumber,
    ContractDate,
    CountryFromName,
    CountryToName,
    SUM(TotalQty) AS SumTotalQuantity,
    Vans,
    SUM(UnitPrice) as TotalUnitPrice,
    SUM(Amount) AS TotalAmount
    from tbl_Contract
      [...snip...]
    group by  tbl_Contract.ContractID,
    KeyWinCountNumber, 
    ItemName,
    BrandName,
    SellerName,
    BuyerName,
    ContractNumber,
    ContractDate,
    CountryFromName,
    CountryToName,
    Vans

これで1行が返さFirstCountNameCount1 502ます。これは、集計されたフィールドの最初の(最小)値であるため、値があります。

于 2012-12-14T10:34:21.057 に答える
1

それは、CountName フィールド (2 つの間で異なる唯一の値) で何をしたいかによって異なりますが、理論的には、GROUP BY(CountName を除外した場合) または CountName を含めたい場合は、それを集計に通すことができPIVOTます。仕事。

于 2012-12-14T10:20:47.003 に答える