0

2 つの異なる列の合計を比較しようとすると、@Base を宣言する必要があるというエラーが表示されます。次に @Base AS B のようなことをしようとしましたが、エラーは消えます。しかし、私はデータを取得していません。タイプミスをした場合や、INNER JOIN が間違っている場合、誰か助けてもらえますか?

 Declare @Base table(PickupDate smalldatetime, DeliveryDate smalldatetime, PickupAdrID int, PickupCustID varchar(10), DeliveryType char, DeliveryAdrID int, DeliveryCustID varchar(10), DeliveryAlias varchar (30), Volumen float, Weight float) Insert @Base(PickupDate,DeliveryDate, PickupAdrID, PickupCustID, DeliveryType, DeliveryAdrID, DeliveryCustID, DeliveryAlias, Volumen,Weight) 
 SELECT PickupDate,DeliveryDate, PickupAdrID, PickupCustID, DeliveryType, DeliveryAdrID, DeliveryCustID, DeliveryAlias, Volumen, Weight 
 FROM Sending 
 INNER JOIN Address_ViewI ON Sending.PickupAdrID = Address_ViewI.AdrID 
 INNER JOIN Address_ViewI AS Address_View_DE ON Sending.DeliveryAdrID = Address_View_DE.AdrID 
 WHERE (Address_ViewI.CountryUK = @puC AND Address_View_DE.CountryUK = @deC) AND (Sending.PickupDate >= @start) AND (Sending.PickupDate < @end) AND ((PickUpCustID Like 'TMHSE' OR DeliveryCustID like 'TMHSE' ) )
  OR   (Address_ViewI.CountryUK = @puC AND Address_View_DE.CountryUK = @deC) AND (Sending.PickupDate >= @start) AND (Sending.PickupDate < @end) AND ((PickUpCustID Like 'SomeName' OR DeliveryCustID like 'SomeName' ) ) 

 SELECT totals.DeliveryAdrID, totals.PickupDate, 
       (CASE WHEN weightTOTAL <= volumenTOTAL THEN volumenTOTAL  
        WHEN weightTOTAL >= volumenTOTAL THEN weightTOTAL ELSE  weightTOTAL END) AS InvoiceWeight 
        FROM @Base INNER JOIN 
       (SELECT DeliveryAdrID, CONVERT(CHAR(10),PickupDate,110) AS PickupDate, 
        CEILING(SUM(CASE Weight When 0 Then @zeroKiloVal ELSE Weight END)) AS WeightTOTAL, 
        CEILING(SUM(CASE Volumen WHEN 0 THEN (@zeroVoluVal * @zeroVoluFac) ELSE Volumen END)) AS volumenTOTAL, 
        COUNT(DeliveryAdrID)AS Packages 
        FROM @Base GROUP BY CONVERT(CHAR(10),PickupDate,110), DeliveryAdrID ) AS totals 
        ON @Base.DeliveryAdrID = totals.DeliveryAdrID AND CONVERT(CHAR(10),@Base.PickupDate,110) = totals.PickupDate

完全なコードはここにリストされていますhttp://pastie.org/8238866 そして私が得ているエラー

4

3 に答える 3

1

@Baseへの参照にエイリアスを配置するとうまくいきました

Declare @zeroKiloVal float          = 10
Declare @zeroVoluVal float          = 10
Declare @zeroVoluFac float          = 200
Declare @puC        varchar         = 'Sweden'
Declare @deC        varchar         = 'Sweden'
Declare @start      smalldatetime   = '2013-04-21'
Declare @end        smalldatetime   = '2013-05-01'

DECLARE @Base TABLE (SendingID INT, Barcode VARCHAR(50), PickupType CHAR, PickupDate SMALLDATETIME, DeliveryDate SMALLDATETIME, PickupAdrID INT, PickupCustID VARCHAR(10), DeliveryType CHAR, DeliveryAdrID INT, DeliveryCustID VARCHAR(10), DeliveryAlias VARCHAR (30), Volumen FLOAT, [Weight] FLOAT)

INSERT INTO @Base(SendingID, Barcode, PickupType, PickupDate,DeliveryDate, PickupAdrID, PickupCustID, DeliveryType, DeliveryAdrID, DeliveryCustID, DeliveryAlias, Volumen,[Weight]) 
SELECT SendingID = 1, Barcode= 1, PickupType= 1, PickupDate= 1,DeliveryDate= 1, PickupAdrID= 1, PickupCustID= 1, DeliveryType= 1, DeliveryAdrID= 1, DeliveryCustID= 1, DeliveryAlias= 1, Volumen= 1, [Weight] = 1

-- Replacing below code with stubbed data for testing.
-- SELECT SendingID, Barcode, PickupType, PickupDate,DeliveryDate, PickupAdrID, PickupCustID, DeliveryType, DeliveryAdrID, DeliveryCustID, DeliveryAlias, Volumen, Weight 
-- FROM Sending 
-- INNER JOIN Address_ViewI ON Sending.PickupAdrID = Address_ViewI.AdrID 
-- INNER JOIN Address_ViewI AS Address_View_DE ON Sending.DeliveryAdrID = Address_View_DE.AdrID 
-- WHERE (Address_ViewI.CountryUK = @puC AND Address_View_DE.CountryUK = @deC) AND (Sending.PickupDate >= @start) AND (Sending.PickupDate < @end) AND ((PickUpCustID Like 'TMHSE' OR DeliveryCustID like 'TMHSE' ) )
-- OR   (Address_ViewI.CountryUK = @puC AND Address_View_DE.CountryUK = @deC) AND (Sending.PickupDate >= @start) AND (Sending.PickupDate < @end) AND ((PickUpCustID Like 'TMHSE' OR DeliveryCustID like 'TMHSE' ) ) 

SELECT totals.DeliveryAdrID
,   totals.PickupDate
,   InvoiceWeight   =   
    (
        CASE WHEN weightTOTAL <= volumenTOTAL THEN volumenTOTAL  
             WHEN weightTOTAL >= volumenTOTAL THEN weightTOTAL ELSE  weightTOTAL END
    ) 
FROM @Base AS B -- <<Added alias here>>
INNER JOIN 
(
    SELECT DeliveryAdrID
    ,   PickupDate      = CONVERT(CHAR(10),PickupDate,110) 
    ,   WeightTOTAL     = CEILING(SUM(CASE [Weight] WHEN 0 THEN @zeroKiloVal     ELSE [Weight] END))
    ,   volumenTOTAL    = CEILING(SUM(CASE Volumen  WHEN 0 THEN (@zeroVoluVal * @zeroVoluFac) ELSE Volumen END)) 
    ,   Packages        = COUNT(DeliveryAdrID)
    FROM @Base 
    GROUP BY CONVERT(CHAR(10),PickupDate,110), DeliveryAdrID 
) AS totals ON B.DeliveryAdrID = totals.DeliveryAdrID 
AND CONVERT(CHAR(10),B.PickupDate,110) = totals.PickupDate
于 2013-08-15T14:03:10.610 に答える
0

宣言された変数に何かが欠けているように見えるエラーを見つけました:

 Declare @puC varchar = 'Sweden'
 Declare @deC varchar = 'Sweden'

に変更しました

 Declare @puC varchar (50) = 'Sweden'
 Declare @deC varchar (50) = 'Sweden'

時間をありがとう

于 2013-08-16T12:59:11.520 に答える
0

Like次のように、演算子と比較する定数でワイルドカードを使用する必要がある場合があります。

PickUpCustID Like '%TMHSE%' OR DeliveryCustID like '%TMHSE%'

そうでなければ、あなたはただ同じことをしていると思います

PickUpCustID = 'TMHSE' OR DeliveryCustID = 'TMHSE'

また

'TMHSE' in (PickUpCustID, DeliveryCustID)
于 2013-08-15T14:05:03.477 に答える