2015-04-14 46 views
0

我正在運行一個知道數字是否可用的問題。使用SQL Server解決問題的正確方法總和

例如,我有一個存儲交易的表,如果交易是外發的,我們將存儲數量爲負數,如果存在,那麼我們存儲爲正數。

在開始時,我認爲SUM將足以找到可用的數量是否大於零,但它不會是正確的,因爲基於第二個示例數據,你可以看到'Bike-Serial_001'不可用於開始然後在稍後階段它可用。

我該如何編寫SQL查詢和SUM函數來解決這個問題?

ID           Number    Quantity   syscreated 
F7F405B4-CE7E-431B-BAC1-3AC78F436D37 Bike-Serial_001    -1   25-02-2015 12:05:19 
279ABB0A-195E-48CB-8443-E5F8E1FCBA38 Bike-Serial_001    1   25-02-2015 12:05:56 
25A56A3F-A225-4BBB-B458-9D2CCE3F130D Bike-Serial_001    1   25-02-2015 12:06:08 
EC0C0A4E-651D-4CCD-AFEF-547F973B3243 Bike-Serial_001    -1   25-02-2015 12:07:37 
9034E016-19C0-4F3A-A4C6-B84F29D05912 Bike-Serial_001    1   25-02-2015 12:08:14 

Another Example in which simple SUM will not be appropriate. 

ID           Number    Quantity   syscreated 
F7F405B4-CE7E-431B-BAC1-3AC78F436D37 Bike-Serial_001    -1   25-02-2015 12:05:19 
279ABB0A-195E-48CB-8443-E5F8E1FCBA38 Bike-Serial_001    1   25-02-2015 12:05:56 
+0

如果您有一個日期時間列,爲什麼不使用它來查找您最近的數字實例? – Aidan

+0

目前尚不清楚爲什麼'SUM(Quantity)... GROUP BY Number'不符合您的需求。 – TZHX

+0

SUM(質量)將使s1 SUM爲零且不可用。但正如你所看到的,它應該是可用的,因爲最後一筆交易正在進行。 –

回答

2
select Number, 
     case when sum(quantity) >= 0 then 1 else 0 end 
    from Table 
group by Number 

我認爲這能解決你的問題,這給數字列表和0,如果他們不提供則爲1,如果你想只有那些可用它們可

select Number 
     from Table 
    group by Number 
    having sum(quantity) >= 0 

但是,問題是,根據您的描述,這可能會起作用。如果第一個S1有一個包含事務(1),然後是一個傳出(-1),那麼它將被視爲可用。

所以我不確定SUM方法在你的情況下是可行的。問題是你的要求不是很清楚。

如果你的例子是:

ID            Number   Quantity 
45F39260-C646-4CDF-8FC9-E8A2C4B93B9D    S1   1 
F5B033A4-0294-4069-A4D4-9DDBD7D1915D    S2   -1 
B94CDB62-9B8B-4C8A-983C-BD896181FEEA    S3   1 
98F39260-C646-4CDF-8FC9-E9A2C4B93CH7    S1   -1 

將S1被視爲可用?如果是的話,我的方法(用> =)起作用。

如果不是,那麼這個問題不能通過SUM來解決,但必須檢查最後的數量變化。無論是你需要一個datetime/rowversion字段的時候它發生,並做一個select top 1 ..... order by ....獲得可用的數字。但是,如果您沒有日期時間/行轉換字段,那麼您想要做的事情是不可行的,因爲數據中沒有訂單,就像它的外觀一樣,您的ID是GUID,而不是Sequential GUID ....

好了,這應該做的伎倆:

 select Number 
     from YourTable as prim 
    group by Number 
     having sum(quantity) >= case when (select top 1 quantity 
              from #test as sec 
              where sec.number = prim.number 
             order by dt desc) > 0 then 0 
            else 1 end 

PS 老實說,那是一個爛攤子。爲什麼不用觸發器和可用性表? 如果有很多很多很多的交易,你現在的解決方案總和等將變得越來越慢,並且一團糟。

+0

這不會解決問題,因爲您可以看到s1首先有一個負數數量的傳出事務,然後它有一個傳入事務,因此它應該可用。 –

+0

是的,有日期時間列,但如果順序先收集然後傳出,然後SUM工作正常。但是,如果序列首先輸出,然後輸入SUM結果將無法區分是否數字s1應該可用或不可用。 –

+0

那麼爲什麼不使用datetime列來簡單地獲取每個數字的最近事務實例,並用它來決定它是否可用。 「SUM」不應該進入這個!? – Aidan

相關問題