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.
| 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];GOSET ANSI_NULLS ON;GOSET QUOTED_IDENTIFIER ON;GOCREATE FUNCTION [dbo].[GETSHIPPEDNOTINVOICEDQTY](@ItemKey varchar(12))RETURNS numeric(20, 5)ASBEGINDECLARE @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 @RetValENDGOGRANT EXECUTE ON [dbo].[GETSHIPPEDNOTINVOICEDQTY] TO [CRServices];GOGRANT 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. GuptaB.Sc. CS, Minor JapaneseMCITP: Database AdministratorMCTS: SQL Server 2005http://sqllearnings.blogspot.com/ |
 |
|
|
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.FINUMBERCROSS 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] |
 |
|
|
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 0This area is highlighted as an error: SELECT @RetVal = sum( Shitem.fshipqty - Shitem.finvqty ) AS SHIPPEDNOTINVOICEDQTYI tried removing the @RetVal = but still got the error. Any ideas? |
 |
|
|
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.FINUMBERCROSS 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] |
 |
|
|
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 |
 |
|
|
visakh16
Very Important crosS Applying yaK Herder
52326 Posts |
Posted - 2009-03-13 : 13:27:14
|
| are you using sql 2005? |
 |
|
|
DavidChel
Constraint Violating Yak Guru
474 Posts |
Posted - 2009-03-13 : 14:39:04
|
| Umm.. oops. No, I'm on SQL 2000. |
 |
|
|
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)ASBEGIN 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" |
 |
|
|
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? |
 |
|
|
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" |
 |
|
|
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 GETSHIPPEDNOTINVOICEDQTYCREATE FUNCTION.......... |
 |
|
|
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? |
 |
|
|
|
|
|
|
|