deanlee17
asked on
SQL calculation
Hi Experts,
Ok to keep it simple lets assume I have 2 columns:
QTY
TRANSTYPE
Im creating a view so bare in mind this is part of my SELECT clause. I need...
IF (QTY <> 0 AND TRANSTYPE='ADJ' then QTY = QTY * -1)
I dont think I can do this in a CASE statement?
Thanks,
Dean.
Ok to keep it simple lets assume I have 2 columns:
QTY
TRANSTYPE
Im creating a view so bare in mind this is part of my SELECT clause. I need...
IF (QTY <> 0 AND TRANSTYPE='ADJ' then QTY = QTY * -1)
I dont think I can do this in a CASE statement?
Thanks,
Dean.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Will these adjust the existing QTY column? I dont want to add a new column, I want to overwrite the existing one.
DECLARE @NewQuantity bigint;
SELECT @NewQuantity = CASE WHEN (QTY <> 0 AND TRANSTYPE='ADJ') then QTY * -1 ELSE QTY END AS QTY from table;
update table
set qty=@NewQuantity
where ---
SELECT @NewQuantity = CASE WHEN (QTY <> 0 AND TRANSTYPE='ADJ') then QTY * -1 ELSE QTY END AS QTY from table;
update table
set qty=@NewQuantity
where ---
ASKER
Scott, this failed, it created a new column 'AS Expr1', it also didnt even put the values into minuses.
ASKER
BuggyCoder, I'm trying to create a view, can this code be added and run in the view?
DECLARE @NewQuantity bigint;
SELECT @NewQuantity = CASE WHEN (QTY <> 0 AND TRANSTYPE='ADJ') then QTY * -1 ELSE QTY END AS QTY from table;
select @NewQuantity;
SELECT @NewQuantity = CASE WHEN (QTY <> 0 AND TRANSTYPE='ADJ') then QTY * -1 ELSE QTY END AS QTY from table;
select @NewQuantity;
ASKER
BuggyCoder,
This is my code so far, how do I add yours? I cannot have 2 SELECT statements in a view, surely?....
SELECT DISTINCT
TOP (100) PERCENT dbo.tblMestecData.idMESTEC , dbo.tblMestecData.MESDATE, dbo.tblMestecData.LOCATION , dbo.tblMestecData.ALLOCATI ON,
dbo.tblMestecData.OWNERSHI PTYPE, dbo.tblMestecData.PARTNBR, dbo.tblMestecData.VERSION, dbo.tblMestecData.PARTDESC RIPTION, dbo.tblMestecData.QTY,
dbo.tblMestecData.TRANSTYP E, dbo.tblMestecData.REASONCO DE, dbo.tblMestecData.REASONDE SC, dbo.tblMestecData.TRANSCOM MENT,
dbo.tblMestecData.GRNNBR, dbo.tblMestecData.SERIALNB R, dbo.tblMestecData.CURRENCY , dbo.tblMestecData.UNITCOST ,
dbo.tblMestecData.TOTALBAS ELINECOST, dbo.tblMestecData.COMPARTN BR, CASE WHEN OWNERSHIPTYPE = 'VMI Thales' AND
UNITCOST > 0 THEN Price ELSE V1Price END AS DEFV1PRICE, CASE WHEN OWNERSHIPTYPE = 'VMI Thales' AND
UNITCOST > 0 THEN Currency ELSE V1Currency END AS V1_CURRENCY, CASE WHEN CASE WHEN OWNERSHIPTYPE = 'VMI Thales' AND
UNITCOST > 0 THEN Currency ELSE V1Currency END = 'EUR' THEN EUR WHEN CASE WHEN OWNERSHIPTYPE = 'VMI Thales' AND
UNITCOST > 0 THEN Currency ELSE V1Currency END = 'USD' THEN USD ELSE 0 END AS EX_RATE, CASE WHEN OWNERSHIPTYPE = 'VMI Thales' AND
UNITCOST = 0 THEN 0 ELSE CASE WHEN OWNERSHIPTYPE = 'VMI Thales' AND UNITCOST > 0 THEN Price ELSE V1Price END * QTY END AS MAT_COST,
FROM dbo.tblMestecData LEFT OUTER JOIN
dbo.stocksale ON dbo.tblMestecData.PARTNBR = dbo.stocksale.PartNumber LEFT OUTER JOIN
dbo.tblV1Price ON dbo.tblMestecData.PARTNBR = dbo.tblV1Price.V1Item CROSS JOIN
dbo.tblExRates
WHERE (dbo.tblMestecData.MESDATE > '2012-01-29') AND (dbo.tblMestecData.MESDATE < '2012-02-25')
ORDER BY dbo.tblMestecData.TRANSTYP E
This is my code so far, how do I add yours? I cannot have 2 SELECT statements in a view, surely?....
SELECT DISTINCT
TOP (100) PERCENT dbo.tblMestecData.idMESTEC
dbo.tblMestecData.OWNERSHI
dbo.tblMestecData.TRANSTYP
dbo.tblMestecData.GRNNBR, dbo.tblMestecData.SERIALNB
dbo.tblMestecData.TOTALBAS
UNITCOST > 0 THEN Price ELSE V1Price END AS DEFV1PRICE, CASE WHEN OWNERSHIPTYPE = 'VMI Thales' AND
UNITCOST > 0 THEN Currency ELSE V1Currency END AS V1_CURRENCY, CASE WHEN CASE WHEN OWNERSHIPTYPE = 'VMI Thales' AND
UNITCOST > 0 THEN Currency ELSE V1Currency END = 'EUR' THEN EUR WHEN CASE WHEN OWNERSHIPTYPE = 'VMI Thales' AND
UNITCOST > 0 THEN Currency ELSE V1Currency END = 'USD' THEN USD ELSE 0 END AS EX_RATE, CASE WHEN OWNERSHIPTYPE = 'VMI Thales' AND
UNITCOST = 0 THEN 0 ELSE CASE WHEN OWNERSHIPTYPE = 'VMI Thales' AND UNITCOST > 0 THEN Price ELSE V1Price END * QTY END AS MAT_COST,
FROM dbo.tblMestecData LEFT OUTER JOIN
dbo.stocksale ON dbo.tblMestecData.PARTNBR = dbo.stocksale.PartNumber LEFT OUTER JOIN
dbo.tblV1Price ON dbo.tblMestecData.PARTNBR = dbo.tblV1Price.V1Item CROSS JOIN
dbo.tblExRates
WHERE (dbo.tblMestecData.MESDATE
ORDER BY dbo.tblMestecData.TRANSTYP
ASKER
Mbizup: Error in list of function arguments: '<' not recognized.
Unable to parse query text.
Unable to parse query text.
>> Scott, this failed, it created a new column 'AS Expr1', it also didnt even put the values into minuses <<
Something's not right, because it explicilty labeled the column as "QTY".
Maybe you have to use a different name than one that already exists on the table??
You also don't need to check for QTY <> 0, since 0 * -1 will still be zero.
SELECT DISTINCT
TOP (100) PERCENT dbo.tblMestecData.idMESTEC , dbo.tblMestecData.MESDATE, dbo.tblMestecData.LOCATION , dbo.tblMestecData.ALLOCATI ON,
dbo.tblMestecData.OWNERSHI PTYPE, dbo.tblMestecData.PARTNBR, dbo.tblMestecData.VERSION, dbo.tblMestecData.PARTDESC RIPTION, dbo.tblMestecData.QTY,
dbo.tblMestecData.TRANSTYP E, dbo.tblMestecData.REASONCO DE, dbo.tblMestecData.REASONDE SC, dbo.tblMestecData.TRANSCOM MENT,
dbo.tblMestecData.GRNNBR, dbo.tblMestecData.SERIALNB R, dbo.tblMestecData.CURRENCY , dbo.tblMestecData.UNITCOST ,
dbo.tblMestecData.TOTALBAS ELINECOST, dbo.tblMestecData.COMPARTN BR, CASE WHEN OWNERSHIPTYPE = 'VMI Thales' AND
UNITCOST > 0 THEN Price ELSE V1Price END AS DEFV1PRICE, CASE WHEN OWNERSHIPTYPE = 'VMI Thales' AND
UNITCOST > 0 THEN Currency ELSE V1Currency END AS V1_CURRENCY, CASE WHEN CASE WHEN OWNERSHIPTYPE = 'VMI Thales' AND
UNITCOST > 0 THEN Currency ELSE V1Currency END = 'EUR' THEN EUR WHEN CASE WHEN OWNERSHIPTYPE = 'VMI Thales' AND
UNITCOST > 0 THEN Currency ELSE V1Currency END = 'USD' THEN USD ELSE 0 END AS EX_RATE, CASE WHEN OWNERSHIPTYPE = 'VMI Thales' AND
UNITCOST = 0 THEN 0 ELSE CASE WHEN OWNERSHIPTYPE = 'VMI Thales' AND UNITCOST > 0 THEN Price ELSE V1Price END * QTY END AS MAT_COST,
CASE WHEN (TRANSTYPE='ADJ') then QTY * -1 ELSE QTY END AS QTY_NEW
FROM dbo.tblMestecData LEFT OUTER JOIN
dbo.stocksale ON dbo.tblMestecData.PARTNBR = dbo.stocksale.PartNumber LEFT OUTER JOIN
dbo.tblV1Price ON dbo.tblMestecData.PARTNBR = dbo.tblV1Price.V1Item CROSS JOIN
dbo.tblExRates
WHERE (dbo.tblMestecData.MESDATE > '2012-01-29') AND (dbo.tblMestecData.MESDATE < '2012-02-25')
ORDER BY dbo.tblMestecData.TRANSTYP E
Something's not right, because it explicilty labeled the column as "QTY".
Maybe you have to use a different name than one that already exists on the table??
You also don't need to check for QTY <> 0, since 0 * -1 will still be zero.
SELECT DISTINCT
TOP (100) PERCENT dbo.tblMestecData.idMESTEC
dbo.tblMestecData.OWNERSHI
dbo.tblMestecData.TRANSTYP
dbo.tblMestecData.GRNNBR, dbo.tblMestecData.SERIALNB
dbo.tblMestecData.TOTALBAS
UNITCOST > 0 THEN Price ELSE V1Price END AS DEFV1PRICE, CASE WHEN OWNERSHIPTYPE = 'VMI Thales' AND
UNITCOST > 0 THEN Currency ELSE V1Currency END AS V1_CURRENCY, CASE WHEN CASE WHEN OWNERSHIPTYPE = 'VMI Thales' AND
UNITCOST > 0 THEN Currency ELSE V1Currency END = 'EUR' THEN EUR WHEN CASE WHEN OWNERSHIPTYPE = 'VMI Thales' AND
UNITCOST > 0 THEN Currency ELSE V1Currency END = 'USD' THEN USD ELSE 0 END AS EX_RATE, CASE WHEN OWNERSHIPTYPE = 'VMI Thales' AND
UNITCOST = 0 THEN 0 ELSE CASE WHEN OWNERSHIPTYPE = 'VMI Thales' AND UNITCOST > 0 THEN Price ELSE V1Price END * QTY END AS MAT_COST,
CASE WHEN (TRANSTYPE='ADJ') then QTY * -1 ELSE QTY END AS QTY_NEW
FROM dbo.tblMestecData LEFT OUTER JOIN
dbo.stocksale ON dbo.tblMestecData.PARTNBR = dbo.stocksale.PartNumber LEFT OUTER JOIN
dbo.tblV1Price ON dbo.tblMestecData.PARTNBR = dbo.tblV1Price.V1Item CROSS JOIN
dbo.tblExRates
WHERE (dbo.tblMestecData.MESDATE
ORDER BY dbo.tblMestecData.TRANSTYP
ASKER
Thanks Scott, that worked fine.
SELECT Qty * iif(QTY <> 0 AND TRANSTYPE='ADJ' ,-1,1) as QtyAdjusted, TransType ....