2013-08-15 2 views
0

Я пытаюсь сравнить сумму двух разных столбцов, и я получаю сообщение об ошибке, указывающее, что я должен объявить @Base. Затем я попытался сделать что-то вроде @Base AS B, ошибка исчезнет. Но я не получаю никаких данных. Может ли кто-нибудь помочь мне, если я сделал опечатку, или мой INNER JOIN ошибается?Сравнение суммы из 2 разных столбцов

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 И ошибка я получаю

ответ

0

Я понял ошибку, кажется, что мои объявленные переменные было что-то не хватает:

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

Я изменил его на

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

Спасибо за ваше время. Ребята

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 
0

Может быть, вам необходимо использовать некоторые подстановочные знаки в константах по сравнению с оператором Like, таким как:

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

В противном случае, я думаю, вы просто делаете то же самое, как

PickUpCustID = 'TMHSE' OR DeliveryCustID = 'TMHSE' 

или

'TMHSE' in (PickUpCustID, DeliveryCustID) 
Смежные вопросы