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

也许您需要在与Like运算符进行比较的常量中使用一些通配符,例如:

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

否则,我认为你只是在做同样的事情

PickUpCustID = 'TMHSE' OR DeliveryCustID = 'TMHSE'

或者

'TMHSE' in (PickUpCustID, DeliveryCustID)
于 2013-08-15T14:05:03.477 回答
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 回答