這些都是我需要從一個存儲過程返回值:我該如何構建一個存儲過程,它將返回包含許多計算值的結果集?
Description
Week 1 Usage
Week 2 Usage
Usage Variance
Week 1 Price
Week 2 Price
Price Variance
% of Price Variance
與「變異」在他們的名字是基於其他值計算領域,「周」分區的三個字段必須根據日期參數計算。因此,駐留在數據庫表中的實際(最相關)字段有:
Description
Usage
Price
InvoiceDate
由用戶提供的參數是:
Unit
DateBegin
DateEnd
的變量,我想我需要在存儲申報過程是:
DECLARE
@Week1Begin datetime,
@Week1End datetime,
@Week2Begin datetime,
@Week2End datetime,
@Week1Usage varchar(30),
@Week2Usage varchar(30),
@Week1Price varchar(30),
@Week2Price varchar(30),
@UsageVariance varchar(30),
@PriceVariance varchar(30),
@PercentageOfPriceVariance varchar(30)
Week1Begin
和Week1End
將具有基於由用戶在DateBegin
提供的值被計算參數(例如,如果DateBegin
是12/27/15,則Week1Begin
將是12/27/2015而Week1End
將是1/2/2016);
Week2Begin
和Week2End
有異曲同工之處,但他們的跨度可以超過七天少,如果至多比有7天以上(Week2End
將根據需要「淪落」到以前的日期)。
所以雖然有很多計算正在進行,但原始數據非常稀疏。它基本上是上述四個字段(說明,用法,價格和發票日期),可從InvoiceDetail
表中獲得。我最大的困惑是大部分數據是從現有的存儲過程返回的,可能是最好的複製和擴展,但我不是SQL專家 - 我可以編寫簡單的SELECT
和UPDATE
等,聲明,但與臨時表和這種關係旋轉跳舞遠遠超過了我。
因此,創建一個基於現有存儲過程的新存儲過程似乎充滿了危險; OTOH,我想知道是否有可能使用包含多個子選擇的複雜查詢語句使用相當小的存儲過程來檢索我需要的數據。
同樣,複雜的SQL是不是我的專長以任何方式,所以我可能是「遙遠」在這裏,但這裏是我的僞SQL:
CREATE Procedure [dbo].[myFunkySP]
@Unit varchar(25),
@BegDate datetime,
@EndDate datetime
As
// Create a mostly-empty-for-now temp table
Select Description,
Week1Begin,
Week1End,
Week2Begin,
Week2End,
Week1Usage,
Week2Usage,
Week1Price,
Week2Price,
UsageVariance,
PriceVariance
PercentageOfPriceVariance
Into #TempItems
From InvoiceDetail Ind
Where Ind.Unit = @Unit
and Ind.InvoiceDate Between @BegDate and @EndDate
begin
Update #TempItems set
Week1Begin = // val [email protected]
Week1End = // do some date math to determine; maybe a Function called GetEndOfWeek(Week1Begin)?
Week2Begin = // do some date math to determine (1 day beyond Week1End val)
Week2End = // val [email protected]
Week1Usage = SELECT SUM(USAGE) FROM InvoiceDetail WHERE UNIT = @UNIT, DATE BETWEEN Week1Begin AND Week1End
Week2Usage = SELECT SUM(USAGE) FROM InvoiceDetail WHERE UNIT = @UNIT, DATE BETWEEN Week2Begin AND Week2End
Week1Price = SELECT SUM(PRICE) FROM InvoiceDetail WHERE UNIT = @UNIT, DATE BETWEEN Week1Begin AND Week1End
Week2Price = SELECT SUM(PRICE) FROM InvoiceDetail WHERE UNIT = @UNIT, DATE BETWEEN Week2Begin AND Week2End
UsageVariance = (Week2Usage - Week1Usage)
PriceVariance = (Week2Price - Week1Price)
PercentageOfPriceVariance = (PriceVariance div week2Price)
// now select * from the temp table to return everything?
否則(如果以上都不行或者是不可行的),我想我可能要做一些超A-一袋菸頭9-X-醜陋的查詢與beaucoup子查詢污染,是這樣的:
SELECT DESCRIPTION,
(SELECT SUM(USAGE) FROM InvoiceDetail
WHERE UNIT = @UNIT, InvoiceDate BETWEEN :firstWeekBegin AND :firstWeekEnd as Week1Usage),
(SELECT SUM(USAGE) FROM InvoiceDetail
WHERE UNIT = @UNIT, InvoiceDate BETWEEN :secondWeekBegin AND :secondWeekEnd as Week2Usage),
SELECT PRICE FROM InvoiceDetail
WHERE UNIT = @UNIT, InvoiceDate = firstWeekBegin as Week1Price),
(SELECT PRICE FROM InvoiceDetail
WHERE UNIT = @UNIT, InvoiceDate = secondWeekBegin as Week2Price),
FROM InvoiceDetail
WHERE UNIT = @UNIT, InvoiceDate BETWEEN @BEGDATE AND @ENDATE ORDER BY PRODUCTS
說它不是」所以,喬!
即使這個複雜的查詢是可行的,它仍然不會給我我需要的計算值(UsageVariance,PriceVariance和PercentageOfPriceVariance)。
那麼,我需要做什麼來創建一個存儲過程,將返回我需要的結果?
作爲一個附註:爲什麼很多母語爲英語的人經常寫「存儲過程」?就我學習英語而言,你只在句子的開頭,或者當他們代表神聖,皇家或地理位置 - 這兩者都不適用於此 - 這些只是一個**程序** **存儲在你的數據庫裏面(在這種情況下是SQL Server) - 爲什麼這種衝動要把這些首字母大寫? '' –
我更喜歡所有名詞都是大寫的德語方法;每種語言都有其優點。我喜歡西班牙語在句子開頭使用的倒立問題和驚歎號,以及「和」,「o」(或有時是「u」)儘可能短的「y」(或有時是「e」) 「)爲」或「,」和「爲」爲「。 –