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

这属于聚合,通常聚合意味着对要压缩为单行的行进行操作(总和、平均值、标准差)。例如,如果您的数据包含每人每天的 cookie 销售数量:

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

你想看看每一天的销售额是多少,你会选择person并按sum(sales)人分组

select  
   person
   sum(sales)
from salesData
group by person

您的案例不太标准,因为您正在尝试聚合基于字符或字母数字的文件。这很好,有点,因为有一些聚合可以与字符字段一起使用。MIN仍然可以正常工作MAX- 分别返回第一个和最后一个字段。

即,对集合 , 执行 a将按min原样a返回(按字符串排序规则排序的最小值)。您似乎还有其他一些数字字段(, , ) - 这些您可以选择正确的聚合 - 我怀疑很可能bcaAmountUnitPriceTotalQtySUM

所以你可以这样做:

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 行,其中FirstCountName的值 Count1 502是聚合字段中的第一个(最小)值。

于 2012-12-14T10:34:21.057 回答
1

这取决于您想对 CountName 字段(两者之间唯一不同的值)做什么,但理论上您可以使用GROUP BY(如果您排除 CountName)将它通过聚合,或者如果您想包含 CountName,那么可能PIVOT会做工作。

于 2012-12-14T10:20:47.003 回答