2012-02-23 9 views
5

मेरे पास एक ऐसी स्थिति है जहां मुझे एक तालिका से "मात्रा का उपभोग" करने की आवश्यकता है, और इसे दूसरी तालिका के खिलाफ लागू करें जिसमें 1 या अधिक पंक्तियां हैं जो मात्रा में "पूल किए गए" हैं । मुझे यकीन है कि यह कैसे बेहतर वर्णन करने के लिए नहीं कर रहा हूँ यहाँ मैं एक मेज के नजरिए से क्या मतलब है:एसक्यूएल - पंक्तियों से एक घटते मूल्य को घटाकर

Table Pooled_Lots 
---------------------------- 
Id Pool Lot Quantity 
1 1  1 5 
2 1  2 10 
3 1  3 4 
4 2  1 7 
5 3  1 1 
6 3  2 5 

Table Pool_Consumption 
---------------------------- 
Id PoolId QuantityConsumed 
1 1  17 
2 2  8 
3 3  10 

मैं एक SQL क्वेरी से एक है, जिसके परिणामस्वरूप rowset कि कैसा दिखेगा की जरूरत है:

Pool Lot Quantity QuantityConsumed RunningQuantity RemainingDemand SurplusOrDeficit 
1  1 5   17     0    12    NULL 
1  2 10   17     0    2    NULL 
1  3 4   17     2    0    2 
2  1 7   8     0    1    -1 
3  1 1   10     0    9    NULL 
3  2 5   10     0    4    -4 

तो, Pool_Consumption.QuantityConsumed को Pooled_Lots की पंक्तियों पर घटाए गए "घटते मूल्य" होने की आवश्यकता है जहां Pool_Consumption.PoolId = Pooled_Lots.Pool। मैं समझ नहीं है कि कैसे आप एक प्रश्न है कि कहते हैं राज्य होगा:

  • तो अंतिम पंक्ति पर नहीं, AmtConsumedFromLot = मात्रा - QuantityConsumed अगर QuantityConsumed < मात्रा, और मात्रा
  • अधिक पंक्तियाँ हैं, तो QuantityConsumed = QuantityConsumed - मात्रा
  • लूप अंतिम पंक्ति
  • तो अंतिम पंक्ति तक, AmtConsumedFromLot = QuantityConsumed

मान लें आईडी एक प्राथमिक कुंजी है, और लक्ष्य डीबी एसक्यूएल 2 है 005

संपादित करें: के बाद से लोगों का प्रचार कर रहे हैं मैं हूँ "पर्याप्त जानकारी देने के नहीं, बंद कृपया इस" यहाँ और अधिक है: वहाँ नहीं सेट बहुत कि Pool_Consumption, से यह सभी बहुत से आकर्षित करने के लिए की जरूरत है खींचता है जहां Pool_Consumption.PoolId = Pooled_Lots.Pool, जब तक QuantityConsumed या तो पूरी तरह से समाप्त हो गया है या मैं Pooled_Lots पंक्तियों के अंतिम सबसेट जहां Pool_Consumption.PoolId = Pooled_Lots.Pool

मैं यह कैसे और अधिक व्याख्या करने के लिए पता नहीं है के खिलाफ घटाकर कर रहा हूँ। यह होमवर्क सवाल नहीं है, यह एक निर्मित "विचार अभ्यास" नहीं है। मुझे कई पंक्तियों के खिलाफ मात्राबद्ध तरीके से घटाने के तरीके को समझने की कोशिश करने में मदद की ज़रूरत है!

+1

मैं नहीं जानता कि अप-मतदान के इस सवाल है, तो आप कुछ गंभीर डेटा का विवरण स्तर मुद्दे हैं कि लोगों को कर रहे हैं। 'Pool_Consumption' तालिका निर्दिष्ट नहीं करती है कि कितनी खपत वाली इकाइयां आती हैं। इसके अलावा, मैंने एक टाइपो तय किया। -1 – JohnB

+0

कभी नहीं, मैं आपके सभी टाइपो को ठीक करने के लिए परेशान नहीं होने जा रहा हूं। कम से कम, इस सवाल पर सीधे डेटा प्राप्त करने में थोड़ा और समय बिताएं! हालांकि, आपके डिजाइन के साथ शुरू करने के लिए दोषपूर्ण है। (बंद करने के लिए मतदान) – JohnB

+1

@ जॉन बीबी यही वह है जिसे मैं वर्तमान में सामना कर रहा हूं, जितना संभव हो उतना सरल और मेरे काम से गोपनीय डेटा का खुलासा किए बिना।अहंकारी और घोषणा करने के बजाय मैं वोटों के योग्य बेवकूफ सवाल पूछ रहा हूं, शायद आप मुझे इस बात के बारे में बता सकते हैं कि मुझे उस बिंदु पर पहुंचने के लिए "ग्रैन्युलरिटी" जोड़ने की ज़रूरत है जहां मैं वांछित आउटपुट अधिक आसानी से उत्पन्न कर सकता हूं? – Irinotecan

उत्तर

7

वाम ओ पी करने के लिए एक व्यायाम के रूप: सही परिणाम इसके बारे में पता नमूना डेटा दिया जाता है और इस क्वेरी का परिणाम का सारांश:

-- Create some test data. 
declare @Pooled_Lots as table (Id int, Pool int, Lot int, Quantity int) 
insert into @Pooled_Lots (Id, Pool, Lot, Quantity) values 
    (1, 1, 1, 5), (2, 1, 2, 10), (3, 1, 3, 4), 
    (4, 2, 1, 7), 
    (5, 3, 1, 1), (6, 3, 2, 5) 
declare @Pool_Consumption as table (Id int, Pool int, QuantityConsumed int) 
insert into @Pool_Consumption (Id, Pool, QuantityConsumed) values 
    (1, 1, 17), (2, 2, 8), (3, 3, 10) 

select * from @Pooled_Lots order by Pool, Lot 
select * from @Pool_Consumption order by Pool 

; with Amos as (
    -- Start with Lot 1 for each Pool. 
    select PL.Pool, PL.Lot, PL.Quantity, PC.QuantityConsumed, 
    case 
     when PC.QuantityConsumed is NULL then PL.Quantity 
     when PL.Quantity >= PC.QuantityConsumed then PL.Quantity - PC.QuantityConsumed 
     when PL.Quantity < PC.QuantityConsumed then 0 
     end as RunningQuantity, 
    case 
     when PC.QuantityConsumed is NULL then 0 
     when PL.Quantity >= PC.QuantityConsumed then 0 
     when PL.Quantity < PC.QuantityConsumed then PC.QuantityConsumed - PL.Quantity 
     end as RemainingDemand 
    from @Pooled_Lots as PL left outer join 
     @Pool_Consumption as PC on PC.Pool = PL.Pool 
    where Lot = 1 
    union all 
    -- Add the next Lot for each Pool. 
    select PL.Pool, PL.Lot, PL.Quantity, CTE.QuantityConsumed, 
    case 
     when CTE.RunningQuantity + PL.Quantity >= CTE.RemainingDemand then CTE.RunningQuantity + PL.Quantity - CTE.RemainingDemand 
     when CTE.RunningQuantity + PL.Quantity < CTE.RemainingDemand then 0 
     end, 
    case 
     when CTE.RunningQuantity + PL.Quantity >= CTE.RemainingDemand then 0 
     when CTE.RunningQuantity + PL.Quantity < CTE.RemainingDemand then CTE.RemainingDemand - CTE.RunningQuantity - PL.Quantity 
     end 
    from Amos as CTE inner join 
     @Pooled_Lots as PL on PL.Pool = CTE.Pool and PL.Lot = CTE.Lot + 1 
) 
select *, 
    case 
    when Lot = (select max(Lot) from @Pooled_Lots where Pool = Amos.Pool) then RunningQuantity - RemainingDemand 
    else NULL end as SurplusOrDeficit 
    from Amos 
    order by Pool, Lot 
+0

धन्यवाद! यह वही करता है जो मैं चाहता हूं, और भी! (हालांकि मुझे लगता है कि मैं RunningQuantity और RemainingDemand को शामिल करें, क्योंकि वे उपयोगी हैं) – Irinotecan

+2

+1 यह पता लगाने के लिए कि – CodeThug

+2

@TimLarson - यह एक सामान्य गोदाम स्टॉक पिकिंग समस्या की तरह दिखता है। मुझे चाहिए 13 सितारा-बेल वाली स्नीच। स्टार-बेलीड स्नेच शेल्फ पर पहला बॉक्स पकड़ें और देखें कि पर्याप्त हैं या नहीं। यदि हां, तो बढ़िया। यदि नहीं, तो अगले बॉक्स को पकड़ो। जब आप शेल्फ के अंत से गिर जाते हैं तो आप अपने पेंट और स्टैंसिल को पकड़ते हैं और सितारों के बिना सितारों के बिना स्नीच की तलाश शुरू करते हैं। – HABO

1

(प्रश्न के संस्करण 4 के आधार पर के रूप में मेरे वाईफ़ाई नीचे चला गया पिछले कुछ समय से)

(SELECT 
    Pool, 
    SUM(Quantity) as Pool_Quantity 
FROM 
    Pooled_Lots 
GROUP BY 
    Pool) as Pool_Quantity_Table 

के लिए अब आप के साथ पूल मात्रा एक मेज एकल मूल्य में लुढ़का है।

अब पूरा क्वेरी:

SELECT 
    Pool_Consumption.PoolID as Pool, 
    Pool_Quantity_Table.Pool_Quantity as Quantity, 
    Pool_Consumption.QuantityConsumed as AmtConsumedFromLot, 
    (Pool_Quantity_Table.Pool_Quantity - Pool_Consumption.QuantityConsumed) as SurplusOrDefecit 
FROM 
    Pool_Consumption 
INNER JOIN 
    (SELECT 
    Pool, 
    SUM(Quantity) as Pool_Quantity 
    FROM 
    Pooled_Lots 
    GROUP BY 
    Pool) as Pool_Quantity_Table 
ON (Pool_Consumption.PoolID = Pool_Quantity_Table.Pool); 
+0

इसका उत्तर देने के लिए समय लेने के लिए धन्यवाद, जॉनबी। हालांकि मेरे वर्तमान परिस्थिति में बहुत से परिणाम विभाजित होने के कारण थोड़ा और सहायक है, यह उत्तर मुझे मेरी समस्या के समाधान को समझने में भी मदद करता है। मैं अपनी मूल अंत परिणाम तालिका में त्रुटियों के लिए क्षमा चाहता हूं, मैंने सोचा कि मैंने दो बार जांच की है और जब तक आपने संशोधन नहीं किया तब तक इसे नहीं देखा। – Irinotecan

+0

आपका बहुत स्वागत है। मुझे खुशी है कि आपको अपनी समस्या का समाधान मिला है! :) – JohnB

संबंधित मुद्दे