I'm trying to compare the sum of 2 different columns and I'm getting an error saying that I must declare @Base. Then I have tried to do something like @Base AS B, the error will disappear. But I'm not retrieving any data. Can anyone help me with if I have made a typo or my INNER JOIN is wrong?

 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

The full code is listed here http://pastie.org/8238866 And the error I'm getting

有帮助吗?

解决方案 3

I figured out the error it seems that my declared variables was missing something:

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

I changed it to

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

Thanks for your time guys

其他提示

It worked for me when I placed an alias on the reference to @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

Maybe you need to use some wildcards in the constants being compared with the Like operator, such as:

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

Otherwise, I think you're just doing the same as

PickUpCustID = 'TMHSE' OR DeliveryCustID = 'TMHSE'

or

'TMHSE' in (PickUpCustID, DeliveryCustID)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top