2016-01-13 12 views
-1

這些都是我需要從一個存儲過程返回值:我該如何構建一個存儲過程,它將返回包含許多計算值的結果集?

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) 

Week1BeginWeek1End將具有基於由用戶在DateBegin提供的值被計算參數(例如,如果DateBegin是12/27/15,則Week1Begin將是12/27/2015而Week1End將是1/2/2016);

Week2BeginWeek2End有異曲同工之處,但他們的跨度可以超過七天少,如果至多比有7天以上(Week2End將根據需要「淪落」到以前的日期)。

所以雖然有很多計算正在進行,但原始數據非常稀疏。它基本上是上述四個字段(說明,用法,價格和發票日期),可從InvoiceDetail表中獲得。我最大的困惑是大部分數據是從現有的存儲過程返回的,可能是最好的複製和擴展,但我不是SQL專家 - 我可以編寫簡單的SELECTUPDATE等,聲明,但與臨時表和這種關係旋轉跳舞遠遠超過了我。

因此,創建一個基於現有存儲過程的新存儲過程似乎充滿了危險; 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)。

那麼,我需要做什麼來創建一個存儲過程,將返回我需要的結果?

+1

作爲一個附註:爲什麼很多母語爲英語的人經常寫「存儲過程」?就我學習英語而言,你只在句子的開頭,或者當他們代表神聖,皇家或地理位置 - 這兩者都不適用於此 - 這些只是一個**程序** **存儲在你的數據庫裏面(在這種情況下是SQL Server) - 爲什麼這種衝動要把這些首字母大寫? '' –

+0

我更喜歡所有名詞都是大寫的德語方法;每種語言都有其優點。我喜歡西班牙語在句子開頭使用的倒立問題和驚歎號,以及「和」,「o」(或有時是「u」)儘可能短的「y」(或有時是「e」) 「)爲」或「,」和「爲」爲「。 –

回答

0

答案可以通過以下lad2025的意見here被發現。

基本上,定義他們在創建表所示:

USAGEVARIANCE AS WEEK2USAGE - WEEK1USAGE, 
PRICEVARIANCE AS WEEK2PRICE - WEEK1PRICE, 
PRICEVARIANCEPERCENTAGE AS (WEEK2PRICE - WEEK1PRICE)/WEEK1PRICE 

...更多背景:

WEEK1USAGE DECIMAL(18,10), 
WEEK1PRICE DECIMAL(18,10), 
WEEK2USAGE DECIMAL(18,10), 
WEEK2PRICE DECIMAL(18,10), 
USAGEVARIANCE AS WEEK2USAGE - WEEK1USAGE, 
PRICEVARIANCE AS WEEK2PRICE - WEEK1PRICE, 
PRICEVARIANCEPERCENTAGE AS (WEEK2PRICE - WEEK1PRICE)/WEEK1PRICE 

之後,你不必考慮它們在INSERT語句 - 當它們所依賴的值被添加時,計算值會自動添加。

1

擴展評論,並不需要不是一個答案
更新的一部分。起初你需要計算週末和week2bigin在SP的磨合。在此之後,SELECT語句是prety直截了當 -

DECLARE @Week1End datetime ,@Week2begin datetime 

    Select Description, 
    @BegDate BegDate, 
    @Week1End Week1End, 
    @Week1End Week2Begin, 
    @EndDate EndDate, 
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Usage ELSE 0 END) Week1Usage, 
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @Week2Begin AND @EndDate THEN Ind.Usage ELSE 0 END) Week2Usage, 
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Price ELSE 0 END) Week1Price, 
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @Week2Begin AND @EndDate THEN Ind.Price ELSE 0 END) - 
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Usage ELSE 0 END) UsageVariance, 
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @Week2Begin AND @EndDate THEN Ind.Usage ELSE 0 END) - 
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Price ELSE 0 END) PriceVariance, 
    (SUM(CASE WHEN Ind.InvoiceDate BETWEEN @Week2Begin AND @EndDate THEN Ind.Usage ELSE 0 END) - 
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Price ELSE 0 END)) 
    / SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Price ELSE 0 END)  
    PercentageOfPriceVariance 
    From InvoiceDetail Ind 
    Where Ind.Unit = @Unit 
    AND @Ind.InvoiceDate BETWEEN @BegDate AND @EndDate 
+0

它看起來很像是對我的回答,但將它與另一個由Ramazan Binarbasi的回答相比較,這是否會返回一個表格,還是需要爲上面的代碼添加其他內容? –

+0

我想創建一個幾乎完全一樣的SP,看看我得到了什麼結果,但它不會編譯;我在http://stackoverflow.com/questions/34772214/where-is-the-incorrect-syntax-near-sum-in-this-sp –

+1

問了一個關於這個問題的新任務。似乎我錯過了一個逗號,SQLFiddle是在當時沒有SQL,對不起。 – Horaciux

相關問題