2012-04-04 9 views
0

私はいくつかの列の合計とカウントを表示するために、複数のテーブルを結合する動的検索クエリを持っています。しかし、sum関数は間違った値を返します。それは結合を引き起こす。しかし、私は何をすべきか分からない、ちょうど私が配達で参加を取り除く場合は、テーブル結果がtrueになることを知っている。しかし、私の配送テーブルは検索のパラメータが必要です。テーブルとサム関数の間で結合する==>間違った値を返します

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 @[email protected]+' where '; 
end 
--------------------------------------------- 
if(@EntryFrom<>'' and @EntryTo<>'' and (@[email protected])) 
begin 
set @[email protected]+' Cargo.InputDate=cast(CONVERT(char(10), '''[email protected]+''',126) as datetime) and '; 
end 
else if(@EntryFrom<>'' and @EntryTo<>'') 
begin 
    set @[email protected]+' Cargo.InputDate between cast(CONVERT(char(10), '''[email protected]+''',126) as datetime) and cast(CONVERT(char(10), '''[email protected]+''',126) as datetime) and '; 
end  
else if(@EntryFrom<>'' and @EntryTo='') 
begin 
set @[email protected]+' Cargo.InputDate >=cast(CONVERT(char(10), '''[email protected]+''',126) as datetime) and '; 
end 
else if(@EntryFrom='' and @EntryTo<>'') 
begin 
set @[email protected]+' Cargo.InputDate <=cast(CONVERT(char(10), '''[email protected]+''',126) as datetime) and '; 
end 
--------------------------------------------- 
if(@DeliveredFrom<>'' and @DeliveredTo<>'' and (@[email protected])) 
begin 
set @[email protected]+' Delivery.DeliveryDate=cast(CONVERT(char(10), '''[email protected]+''',126) as datetime) and '; 
end 
else if(@DeliveredFrom<>'' and @DeliveredTo<>'') 
begin 
    set @[email protected]+' Delivery.DeliveryDate between cast(CONVERT(char(10), '''[email protected]+''',126) as datetime) and cast(CONVERT(char(10), '''[email protected]+''',126) as datetime) and '; 
end  
else if(@DeliveredFrom<>'' and @DeliveredTo='') 
begin 
set @[email protected]+' Delivery.DeliveryDate >= cast(CONVERT(char(10), '''[email protected]+''',126) as datetime) and '; 
end 
else if(@DeliveredFrom='' and @DeliveredTo<>'') 
begin 
set @[email protected]+' Delivery.DeliveryDate <= cast(CONVERT(char(10), '''[email protected]+''',126) as datetime) and '; 
end 
--------------------------------------------- 
if(@Origin<>'') 
begin 
set @[email protected]+' Cargo.Origin = cast('''[email protected]+''' as int) and '; 
end 
--------------------------------------------- 
if(@Transit<>'') 
begin 
set @[email protected]+' Transit.TransitTo = cast('''[email protected]+''' as int) and '; 
end 
--------------------------------------------- 
if(@CargoCode<>'') 
begin 
    set @[email protected]+' CargoNumber=cast('''[email protected]+''' as char(16)) and '; 
end 
--------------------------------------------- 
if(@FlightNo<>'') 
begin 
    set @[email protected]+' CargoService.FlightNo=cast('''[email protected]+''' as nvarchar(255)) and '; 
end 
--------------------------------------------- 
if(@Name<>'') 
begin 
set @[email protected]+' Cargo.Rname like N'''[email protected]+''' and '; 
end 
--------------------------------------------- 
if(@Family<>'') 
begin 
set @[email protected]+' Cargo.RFamily like N'''[email protected]+''' and '; 
end 
--------------------------------------------- 
if(@RealName<>'') 
begin 
set @[email protected]+' Delivery.RName like N'''[email protected]+''' and '; 
end 
--------------------------------------------- 
if(@RealFamily<>'') 
begin 
set @[email protected]+' Delivery.RFamily like N'''[email protected]+''' and '; 
end 
--------------------------------------------- 
if(@Daily<>'') 
begin 
    set @[email protected]+' convert(varchar, Cargo.SaveDate, 111) = convert(varchar, getdate(), 111) and '; 
end 
--------------------------------------------- 
if(@UndeliveredTransit<>'') 
begin 
    set @[email protected]+' Cargo.Delivered = 0 and Cargo.Transit = 1 and '; 
end 
--------------------------------------------- 
if(@Undelivered<>'') 
begin 
    set @[email protected]+' Cargo.Delivered = 0 and '; 
end 
--------------------------------------------- 
if(@UndeliveredPerishable<>'') 
begin 
    set @[email protected]+' Contents.Perishable = 1 AND Cargo.Delivered = 0 and '; 
end 
--------------------------------------------- 
if(@Delivered <> '') 
begin 
    set @[email protected]+' 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; 

答えて

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'''[email protected]+''''; 
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 
+0

こんにちは、おかげであなたの返事のためにたくさんの、そして最後の条件をどこに加えるべきですか?ページの最後に?または配信テーブルのフィールドを確認するたびにそれを繰り返しますか? –

+0

私はそれを見つけた、tnx Nikola –

+0

最後に。その目的は、配送テーブルに関するすべての条件を単一のものに連結することです。どういたしまして :-) –

関連する問題