Please start any new threads on our new site at https://forums.sqlteam.com. We've got lots of great SQL Server experts to answer whatever question you can come up with.

 All Forums
 General SQL Server Forums
 New to SQL Server Programming
 Here's a headache.

Author  Topic 

DavidChel
Constraint Violating Yak Guru

474 Posts

Posted - 2009-03-10 : 15:56:35
This Query works. I created it about a year ago.

SELECT dbo.somast.[fcompany],
dbo.somast.[fcustno],
dbo.somast.[forderdate],
sorels.fsono,
dbo.somast.[fsorev],
dbo.somast.[fcustpono],
sorels.identity_column,
sorels.fsono,
sorels.fenumber,
sorels.frelease,
( SORELS.fshipbook + SORELS.fshipbuy + sorels.fshipmake ) AS shipped,
sorels.finvqty,
sorels.forderqty,
COALESCE( DBO.GETSHIPPEDNOTINVOICEDQTY(sorels.fsono
+ sorels.finumber
+ sorels.frelease),
0 )
AS SHIPPEDNOTINVOICED,
( SORELS.forderqty - SORELS.finvqty
- COALESCE( DBO.GETSHIPPEDNOTINVOICEDQTY(sorels.fsono
+ sorels.finumber
+ sorels.frelease),
0 ) )
* SORELS.funetprice
AS NewFNBOAMT
FROM SORELS
JOIN
SOMAST
ON SOMAST.FSONO = SORELS.FSONO
JOIN
SOITEM
ON SOITEM.FSONO = SORELS.FSONO AND SOITEM.FINUMBER = SORELS.FINUMBER
WHERE SOMAST.FSTATUS = 'OPEN'
AND FMASTERREL = 0
AND somast.forderdate >= CONVERT( DATETIME, '01/01/2002' )


As you can see, it includes the following UDF:

/****** Object: User-Defined Function [dbo].[GETSHIPPEDNOTINVOICEDQTY]   Script Date: 3/10/2009 2:55:13 PM ******/
USE [M2MData01];
GO
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
CREATE FUNCTION [dbo].[GETSHIPPEDNOTINVOICEDQTY]
(@ItemKey varchar(12))
RETURNS numeric(20, 5)
AS
BEGIN
DECLARE @RetVal NUMERIC(20, 5)
SELECT @RetVal = sum( Shitem.fshipqty - Shitem.finvqty )
FROM shmast,
shitem
LEFT JOIN inmast ON inmast.fpartno = shitem.fpartno
AND inmast.frev = shitem.frev
AND inmast.fac = shitem.fac
WHERE shitem.fsokey = @ItemKey
AND Shitem.fshipno = Shmast.fshipno
AND fconfirm = 'Y'
AND ftype <> 'JO'
AND ftype <> 'VE'
AND ftype <> 'MI'
AND shitem.fitemtype <> 'M'
AND flisinv = 0
AND fcstatus <> 'C'
AND LEN(Shitem.IDONO) = 0
AND ( Shitem.fshipqty - Shitem.finvqty ) > 0
RETURN @RetVal
END
GO


GRANT EXECUTE ON [dbo].[GETSHIPPEDNOTINVOICEDQTY] TO [CRServices];
GO
GRANT EXECUTE ON [dbo].[GETSHIPPEDNOTINVOICEDQTY] TO [Reports];
GO




Now, this all works. However, I'd like to create a single statement out of this for simplicity and performance reasons.

I was thinking about a nested query with an alias, but started to brain hemorrhage. Can someone point me in the right direction?

guptam
Posting Yak Master

161 Posts

Posted - 2009-03-11 : 00:26:21
Try ... CTE? I can't test it... but this is just an idea .. I am not sure if it will work for you ...'

;WITH ComputedResults AS (
SELECT shitem.fsokey, sum( Shitem.fshipqty - Shitem.finvqty ) AS SumOfValues
FROM shmast
JOIN shitem ON Shitem.fshipno = Shmast.fshipno
LEFT JOIN inmast ON inmast.fpartno = shitem.fpartno
AND inmast.frev = shitem.frev
AND inmast.fac = shitem.fac
WHERE fconfirm = 'Y'
AND ftype <> 'JO'
AND ftype <> 'VE'
AND ftype <> 'MI'
AND shitem.fitemtype <> 'M'
AND flisinv = 0
AND fcstatus <> 'C'
AND LEN(Shitem.IDONO) = 0
AND ( Shitem.fshipqty - Shitem.finvqty ) > 0
GROUP BY shitem.fsokey )

SELECT dbo.somast.[fcompany],
dbo.somast.[fcustno],
dbo.somast.[forderdate],
sorels.fsono,
dbo.somast.[fsorev],
dbo.somast.[fcustpono],
sorels.identity_column,
sorels.fsono,
sorels.fenumber,
sorels.frelease,
( SORELS.fshipbook + SORELS.fshipbuy + sorels.fshipmake ) AS shipped,
sorels.finvqty,
sorels.forderqty,
COALESCE( SumOfValues,0 ) AS SHIPPEDNOTINVOICED,
( SORELS.forderqty - SORELS.finvqty
- COALESCE( SumOfValues, 0 ) )* SORELS.funetprice
AS NewFNBOAMT

FROM SORELS
JOIN SOMAST ON SOMAST.FSONO = SORELS.FSONO
JOIN SOITEM ON SOITEM.FSONO = SORELS.FSONO AND SOITEM.FINUMBER = SORELS.FINUMBER
JOIN ComputedResults ON fsokey = (sorels.fsono + sorels.finumber + sorels.frelease)
WHERE SOMAST.FSTATUS = 'OPEN'
AND FMASTERREL = 0
AND somast.forderdate >= CONVERT( DATETIME, '01/01/2002' )

Thanks.

--
Mohit K. Gupta
B.Sc. CS, Minor Japanese
MCITP: Database Administrator
MCTS: SQL Server 2005
http://sqllearnings.blogspot.com/
Go to Top of Page

visakh16
Very Important crosS Applying yaK Herder

52326 Posts

Posted - 2009-03-11 : 13:44:11
[code]
SELECT dbo.somast.[fcompany],
dbo.somast.[fcustno],
dbo.somast.[forderdate],
sorels.fsono,
dbo.somast.[fsorev],
dbo.somast.[fcustpono],
sorels.identity_column,
sorels.fsono,
sorels.fenumber,
sorels.frelease,
( SORELS.fshipbook + SORELS.fshipbuy + sorels.fshipmake ) AS shipped,
sorels.finvqty,
sorels.forderqty,
COALESCE( tmp.SHIPPEDNOTINVOICEDQTY,
0 )

AS SHIPPEDNOTINVOICED,
( SORELS.forderqty - SORELS.finvqty
- COALESCE( tmp.SHIPPEDNOTINVOICEDQTY,
0 ) )
* SORELS.funetprice
AS NewFNBOAMT

FROM SORELS
JOIN
SOMAST
ON SOMAST.FSONO = SORELS.FSONO
JOIN
SOITEM
ON SOITEM.FSONO = SORELS.FSONO AND SOITEM.FINUMBER = SORELS.FINUMBER
CROSS APPLY (
SELECT @RetVal = sum( Shitem.fshipqty - Shitem.finvqty ) AS SHIPPEDNOTINVOICEDQTY
FROM shmast,
shitem
LEFT JOIN inmast ON inmast.fpartno = shitem.fpartno
AND inmast.frev = shitem.frev
AND inmast.fac = shitem.fac
WHERE shitem.fsokey = sorels.fsono+ sorels.finumber+ sorels.frelease
AND Shitem.fshipno = Shmast.fshipno
AND fconfirm = 'Y'
AND ftype <> 'JO'
AND ftype <> 'VE'
AND ftype <> 'MI'
AND shitem.fitemtype <> 'M'
AND flisinv = 0
AND fcstatus <> 'C'
AND LEN(Shitem.IDONO) = 0
AND ( Shitem.fshipqty - Shitem.finvqty ) > 0
)tmp

WHERE SOMAST.FSTATUS = 'OPEN'
AND FMASTERREL = 0
AND somast.forderdate >= CONVERT( DATETIME, '01/01/2002' )
[/code]
Go to Top of Page

DavidChel
Constraint Violating Yak Guru

474 Posts

Posted - 2009-03-11 : 14:37:47
Thanks guys. Visakh, I get the following error when running that code:

Error 3/11/2009 1:36:13 PM 0:00:00.046 SQL Server Database Error: Line 29: Incorrect syntax near 'APPLY'.
Incorrect syntax near the keyword 'AS'. 30 0

This area is highlighted as an error:

SELECT @RetVal = sum( Shitem.fshipqty - Shitem.finvqty ) AS SHIPPEDNOTINVOICEDQTY

I tried removing the @RetVal = but still got the error.

Any ideas?
Go to Top of Page

visakh16
Very Important crosS Applying yaK Herder

52326 Posts

Posted - 2009-03-12 : 13:04:24
[code]
SELECT dbo.somast.[fcompany],
dbo.somast.[fcustno],
dbo.somast.[forderdate],
sorels.fsono,
dbo.somast.[fsorev],
dbo.somast.[fcustpono],
sorels.identity_column,
sorels.fsono,
sorels.fenumber,
sorels.frelease,
( SORELS.fshipbook + SORELS.fshipbuy + sorels.fshipmake ) AS shipped,
sorels.finvqty,
sorels.forderqty,
COALESCE( tmp.SHIPPEDNOTINVOICEDQTY,
0 )
AS SHIPPEDNOTINVOICED,
( SORELS.forderqty - SORELS.finvqty
- COALESCE( tmp.SHIPPEDNOTINVOICEDQTY,
0 ) )
* SORELS.funetprice
AS NewFNBOAMT
FROM SORELS
JOIN
SOMAST
ON SOMAST.FSONO = SORELS.FSONO
JOIN
SOITEM
ON SOITEM.FSONO = SORELS.FSONO AND SOITEM.FINUMBER = SORELS.FINUMBER
CROSS APPLY (
SELECT sum( Shitem.fshipqty - Shitem.finvqty ) AS SHIPPEDNOTINVOICEDQTY
FROM shmast,
shitem
LEFT JOIN inmast ON inmast.fpartno = shitem.fpartno
AND inmast.frev = shitem.frev
AND inmast.fac = shitem.fac
WHERE shitem.fsokey = sorels.fsono+ sorels.finumber+ sorels.frelease
AND Shitem.fshipno = Shmast.fshipno
AND fconfirm = 'Y'
AND ftype <> 'JO'
AND ftype <> 'VE'
AND ftype <> 'MI'
AND shitem.fitemtype <> 'M'
AND flisinv = 0
AND fcstatus <> 'C'
AND LEN(Shitem.IDONO) = 0
AND ( Shitem.fshipqty - Shitem.finvqty ) > 0
)tmp
WHERE SOMAST.FSTATUS = 'OPEN'
AND FMASTERREL = 0
AND somast.forderdate >= CONVERT( DATETIME, '01/01/2002' )
[/code]
Go to Top of Page

DavidChel
Constraint Violating Yak Guru

474 Posts

Posted - 2009-03-12 : 15:16:59
Thanks Visakh, but I still get the following:

Error 3/12/2009 2:15:50 PM 0:00:00.046 SQL Server Database Error: Line 29: Incorrect syntax near 'APPLY'.
Line 47: Incorrect syntax near 'tmp'. 30 0
Go to Top of Page

visakh16
Very Important crosS Applying yaK Herder

52326 Posts

Posted - 2009-03-13 : 13:27:14
are you using sql 2005?
Go to Top of Page

DavidChel
Constraint Violating Yak Guru

474 Posts

Posted - 2009-03-13 : 14:39:04
Umm.. oops. No, I'm on SQL 2000.
Go to Top of Page

SwePeso
Patron Saint of Lost Yaks

30421 Posts

Posted - 2009-03-13 : 17:27:04
Rewrite the function as an inline version.
CREATE FUNCTION dbo.GETSHIPPEDNOTINVOICEDQTY
(
@ItemKey varchar(12)
)
RETURNS numeric(20, 5)
AS
BEGIN
return (SELECT sum( Shitem.fshipqty - Shitem.finvqty )
FROM shmast,
shitem
LEFT JOIN inmast ON inmast.fpartno = shitem.fpartno
AND inmast.frev = shitem.frev
AND inmast.fac = shitem.fac
WHERE shitem.fsokey = @ItemKey
AND Shitem.fshipno = Shmast.fshipno
AND fconfirm = 'Y'
AND ftype not in ('JO', 'VE', 'MI')
AND shitem.fitemtype <> 'M'
AND flisinv = 0
AND fcstatus <> 'C'
AND Shitem.IDONO = ''
AND Shitem.fshipqty > Shitem.finvqty
)
END



E 12°55'05.63"
N 56°04'39.26"
Go to Top of Page

DavidChel
Constraint Violating Yak Guru

474 Posts

Posted - 2009-03-16 : 15:50:01
Thanks Peso, but won't that alter the database as well? Won't it save the UDF into the database?
Go to Top of Page

SwePeso
Patron Saint of Lost Yaks

30421 Posts

Posted - 2009-03-16 : 16:38:54
Of course. It will create a new version of same function if you first drop the old version.



E 12°55'05.63"
N 56°04'39.26"
Go to Top of Page

visakh16
Very Important crosS Applying yaK Herder

52326 Posts

Posted - 2009-03-17 : 10:53:57
quote:
Originally posted by DavidChel

Thanks Peso, but won't that alter the database as well? Won't it save the UDF into the database?


alter the database? nope. it wont. once you execute UDF, it gets created in db. better to use this before CREATE FUNCTION...



IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME='GETSHIPPEDNOTINVOICEDQTY' AND ROUTINE_TYPE='FUNCTION')
DROP FUNCTION GETSHIPPEDNOTINVOICEDQTY

CREATE FUNCTION
..........
Go to Top of Page

DavidChel
Constraint Violating Yak Guru

474 Posts

Posted - 2009-03-17 : 13:55:09
So, everyone agrees that if I'm not using 2005, I cannot achieve this with a single select statement?
Go to Top of Page
   

- Advertisement -