【问题标题】:join between table and sum function ==> return wrong value表和求和函数之间的连接 ==> 返回错误值
【发布时间】:2012-04-17 21:50:50
【问题描述】:

我有一个连接多个表的动态搜索查询,用于显示某些列的总和和计数。但是 sum 函数返回错误的值。它导致加入。但我不知道该怎么办,我只知道删除加入 delivery 表结果是否为真。但是我的交货表需要搜索参数。

下面是几行代码:

SELECT     
    COUNT(DISTINCT Cargo.ID) AS 'TotalCargo',
    SUM(CargoService.Weight) AS 'TotalWeight',
    SUM(CargoService.PackageNo) AS 'TotalPack',
    COUNT(DISTINCT CargoService.FlightNo) AS 'TotalFlight',
    COUNT(DISTINCT Cargo.Origin) AS 'TotalOrigin'
FROM         
    Cargo 
INNER JOIN
    CargoService ON Cargo.ID = CargoService.CargoID 
INNER JOIN
    Contents ON Cargo.Contents = Contents.ID 
FULL JOIN
    Delivery ON Cargo.ID = Delivery.CargoID 
FULL JOIN
    Transit ON Cargo.ID = Transit.CargoID
WHERE       
    Cargo.InputDate BETWEEN CAST(CONVERT(char(10), '2012/04/03', 126) AS datetime) 
                        AND CAST(CONVERT(char(10), '2012/04/03', 126) AS datetime)
    AND CargoService.FlightNo = 1356

总搜索查询如下:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER procedure [dbo].[Cargo_SearchTotal]
    @EntryFrom nvarchar(20),
    @EntryTo nvarchar(20),
    @DeliveredFrom nvarchar(20),
    @DeliveredTo nvarchar(20),
    @Origin nvarchar(10),
    @Transit nvarchar(10),
    @CargoCode char(16),
    @Name nvarchar(150),
    @Family nvarchar(150),
    @RealName nvarchar(150),
    @RealFamily nvarchar(150),
    @FlightNo nvarchar(10),
    @Daily nvarchar(10),
    @UndeliveredTransit nvarchar(10),
    @Undelivered nvarchar(10),
    @UndeliveredPerishable nvarchar(10),
    @Delivered nvarchar(10),
    @sort nvarchar(10)
as
    declare @query as nvarchar(max);
    declare @params as nvarchar(max);

    set @query = 'SELECT Count(DISTINCT Cargo.ID) AS ''TotalCargo'',
           sum(CargoService.Weight) AS ''TotalWeight'',
           SUM(CargoService.PackageNo) AS ''TotalPack'',
           COUNT(DISTINCT CargoService.FlightNo) AS ''TotalFlight'',
           COUNT(DISTINCT Cargo.Origin) AS ''TotalOrigin''
FROM        
                  Contents INNER JOIN
                  Cargo ON Contents.ID = Cargo.Contents FULL Join
                  Delivery ON Cargo.ID = Delivery.CargoID full JOIN
                  Transit ON Cargo.ID = Transit.CargoID JOIN
                  CargoService ON Cargo.ID = CargoService.CargoID '
---------------------------------------------  
if(@EntryFrom='select') set @EntryFrom='';
if(@EntryTo='select') set @EntryTo='';
if(@DeliveredFrom='select') set @DeliveredFrom='';
if(@DeliveredTo='select') set @DeliveredTo='';
if(@Origin='select') set @Origin='';
if(@Transit='select') set @Transit='';
if(@CargoCode='select') set @CargoCode='';
if(@Name='select') set @Name='';
if(@Family='select') set @Family='';
if(@RealName='select') set @RealName='';
if(@RealFamily='select') set @RealFamily='';
if(@FlightNo='select') set @FlightNo='';
if(@Daily <> 'True') set @Daily='';
if(@UndeliveredTransit <> 'True') set @UndeliveredTransit='';
if(@Undelivered <> 'True') set @Undelivered='';
if(@UndeliveredPerishable <> 'True') set @UndeliveredPerishable='';
if(@Delivered <> 'True') set @Delivered='';
if(@sort <> 'True') set @sort='';
---------------------------------------------  
if(@EntryFrom<>'' or @EntryTo<>'' or @DeliveredFrom<>'' or @DeliveredTo<>'' or @Origin<>'' 
    or @Transit<>'' or @CargoCode<>'' or @Name<>''
    or @Family<>'' or @RealName<>'' or @RealFamily<>'' or @FlightNo<>'' or @Daily <>''
    or @UndeliveredTransit <>'' or @Undelivered <>'' or @UndeliveredPerishable<>'' or @Delivered<>'')
begin
  set @query=@query+' where ';
end
---------------------------------------------  
if(@EntryFrom<>'' and @EntryTo<>'' and (@EntryFrom=@EntryTo))
begin 
 set @query=@query+' Cargo.InputDate=cast(CONVERT(char(10), '''+@EntryFrom+''',126) as datetime) and ';
end
else if(@EntryFrom<>'' and @EntryTo<>'')
begin
  set @query=@query+' Cargo.InputDate between cast(CONVERT(char(10), '''+@EntryFrom+''',126) as datetime) and cast(CONVERT(char(10), '''+@EntryTo+''',126) as datetime) and ';
end     
else if(@EntryFrom<>'' and @EntryTo='')
begin
 set @query=@query+' Cargo.InputDate  >=cast(CONVERT(char(10), '''+@EntryFrom+''',126) as datetime) and ';
end
else if(@EntryFrom='' and @EntryTo<>'')
begin
 set @query=@query+' Cargo.InputDate <=cast(CONVERT(char(10), '''+@EntryTo+''',126) as datetime) and ';
end
---------------------------------------------  
if(@DeliveredFrom<>'' and @DeliveredTo<>'' and (@DeliveredFrom=@DeliveredTo))
begin 
 set @query=@query+' Delivery.DeliveryDate=cast(CONVERT(char(10), '''+@DeliveredFrom+''',126) as datetime) and ';
end
else if(@DeliveredFrom<>'' and @DeliveredTo<>'')
begin
  set @query=@query+' Delivery.DeliveryDate between cast(CONVERT(char(10), '''+@DeliveredFrom+''',126) as datetime) and cast(CONVERT(char(10), '''+@DeliveredTo+''',126) as datetime) and ';
end     
else if(@DeliveredFrom<>'' and @DeliveredTo='')
begin
 set @query=@query+' Delivery.DeliveryDate >= cast(CONVERT(char(10), '''+@DeliveredFrom+''',126) as datetime) and ';
end
else if(@DeliveredFrom='' and @DeliveredTo<>'')
begin
 set @query=@query+' Delivery.DeliveryDate <= cast(CONVERT(char(10), '''+@DeliveredTo+''',126) as datetime) and ';
end
---------------------------------------------  
if(@Origin<>'')
begin
 set @query=@query+' Cargo.Origin = cast('''+@Origin+''' as int) and ';
end
---------------------------------------------  
if(@Transit<>'')
begin
 set @query=@query+' Transit.TransitTo = cast('''+@Transit+''' as int) and ';
end
---------------------------------------------  
if(@CargoCode<>'')
begin
  set @query=@query+' CargoNumber=cast('''+@CargoCode+''' as char(16)) and ';
end
---------------------------------------------  
if(@FlightNo<>'')
begin
  set @query=@query+' CargoService.FlightNo=cast('''+@FlightNo+''' as nvarchar(255)) and ';
end
---------------------------------------------  
if(@Name<>'')
begin
 set @query=@query+' Cargo.Rname like N'''+@Name+''' and ';
end
---------------------------------------------  
if(@Family<>'')
begin
 set @query=@query+' Cargo.RFamily like N'''+@Family+''' and ';
end
---------------------------------------------  
if(@RealName<>'')
begin
 set @query=@query+' Delivery.RName like N'''+@RealName+''' and ';
end
---------------------------------------------  
if(@RealFamily<>'')
begin
 set @query=@query+' Delivery.RFamily like N'''+@RealFamily+''' and ';
end
---------------------------------------------  
if(@Daily<>'')
 begin
    set @query=@query+' convert(varchar, Cargo.SaveDate, 111) = convert(varchar, getdate(), 111) and ';
end
---------------------------------------------  
if(@UndeliveredTransit<>'')
begin
    set @query=@query+' Cargo.Delivered = 0 and Cargo.Transit = 1 and ';
end
---------------------------------------------  
if(@Undelivered<>'')
begin
    set @query=@query+' Cargo.Delivered = 0 and ';
end
---------------------------------------------  
if(@UndeliveredPerishable<>'')
begin
    set @query=@query+' Contents.Perishable = 1 AND Cargo.Delivered = 0  and ';
end
---------------------------------------------  
if(@Delivered <> '')
begin
    set @query=@query+' Cargo.Delivered = 1 and ';
end
--------------------------------------------- 
if(@EntryFrom<>'' or @EntryTo<>'' or @DeliveredFrom<>'' or @DeliveredTo<>'' or @Origin<>'' 
    or @Transit<>'' or @CargoCode<>'' or @Name<>''
    or @Family<>'' or @RealName<>'' or @RealFamily<>'' or @FlightNo<>'' or @Daily <>'' 
    or @UndeliveredTransit <>'' or @Undelivered <>'' or @UndeliveredPerishable <>'' or @Delivered <>'')
begin
 set @query=substring(@query,0,len(@query)-3);
end 
---------------------------------------------  
set @params =  '@EntryFrom nvarchar(20),
                @EntryTo nvarchar(20),
                @DeliveredFrom nvarchar(20),
                @DeliveredTo nvarchar(20),
                @Origin nvarchar(10),
                @Transit nvarchar(10),
                @CargoCode char(16),
                @Name nvarchar(150),
                @Family nvarchar(150),
                @RealName nvarchar(150),
                @RealFamily nvarchar(150),
                @FlightNo nvarchar(10),
                @Daily nvarchar(10),
                @UndeliveredTransit nvarchar(10),
                @Undelivered nvarchar(10),
                @UndeliveredPerishable nvarchar(10),
                @Delivered  nvarchar(10),
                @sort   nvarchar(10)';
---------------------------------------------  
exec sp_executesql @query,@params,@EntryFrom,@EntryTo,@DeliveredFrom,@DeliveredTo,@Origin, 
                   @Transit,@CargoCode,@Name,
                   @Family,@RealName,@RealFamily,@FlightNo,@Daily, 
                   @UndeliveredTransit,@Undelivered,@UndeliveredPerishable,@Delivered,@sort;

【问题讨论】:

    标签: sql-server search dynamic join relation


    【解决方案1】:

    您可以删除加入并使用存在:

    declare @deliveryQuery as varchar(max)
    declare @deliveryLen int
    set @deliveryQuery = 'and exists (select null 
                                        from Delivery 
                                       where Cargo.ID = Delivery.CargoID'
    -- It will change if we add conditions to @deliveryQuery
    set @deliveryLen = len(@deliveryQuery)
    -- ...
    if(@RealName<>'')
    begin
     set @deliveryQuery = @deliveryQuery 
                          + ' and Delivery.RName like N'''+@RealName+'''';
    end
    -- Aditional conditions here following the pattern above
    
    --And later, test if @deliveryQuery has changed
    if len(@deliveryQuery) <> @deliveryLen
    begin
       set @query = @query + @deliveryQuery + ')'
    end
    

    【讨论】:

    • 您好,非常感谢您的回复,我应该在哪里添加最后一个条件?在页面的末尾?还是在每次检查交付表字段时重复它?
    • 最后。目的是将有关交付表的所有条件连接到单个存在。欢迎你:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    相关资源
    最近更新 更多