2017-12-13 131 views
13

निम्नलिखित तालिका संरचना को देखते हुए, जो एक बस मार्ग का प्रतिनिधित्व है जहां यात्रियों को एक दरवाजा सेंसर के साथ बस पर और बंद हो जाता है। और, एक व्यक्ति है जो उस बस पर बैठता है जिसमें एक क्लिपबोर्ड होता है जिसमें स्पॉट गिनती होती है।लोड की गणना करें और कर्सर से परहेज करें

CREATE TABLE BusLoad(
ROUTE CHAR(4) NOT NULL, 
StopNumber INT NOT NULL, 
ONS INT, 
OFFS INT, 
SPOT_CHECK INT) 
go 
INSERT BusLoad VALUES('AAAA', 1, 5, 0, null) 
INSERT BusLoad VALUES('AAAA', 2, 0, 0, null) 
INSERT BusLoad VALUES('AAAA', 3, 2, 1, null) 
INSERT BusLoad VALUES('AAAA', 4, 6, 3, 8) 
INSERT BusLoad VALUES('AAAA', 5, 1, 0, null) 
INSERT BusLoad VALUES('AAAA', 6, 0, 1, 7) 
INSERT BusLoad VALUES('AAAA', 7, 0, 3, null) 

मैं इस तालिका में "लोड" कॉलम जोड़ना चाहता हूं जो प्रत्येक स्टॉप पर लोड की गणना करता है।

लोड = पिछला बंद हो जाता है लोड + वर्तमान रोक ऑन - वर्तमान रोकने के नापसंद करता है, तो SPOT_CHECK रिक्त है, अन्यथा लोड = SPOT_CHECK

अपेक्षित परिणाम:

ROUTE StopNumber ONS OFFS SPOT_CHECK LOAD 
AAAA 1   5 0  NULL  5 
AAAA 2   0 0  NULL  5 
AAAA 3   2 1  NULL  6 
AAAA 4   6 3  8   8 
AAAA 5   1 0  NULL  9 
AAAA 6   0 1  7   7 
AAAA 7   0 3  NULL  4 

मैं एक कर्सर के साथ ऐसा कर सकते हैं, लेकिन क्या एक प्रश्न का उपयोग कर ऐसा करने का कोई तरीका है?

+4

क्या आप अपेक्षित परिणाम सेट भी पोस्ट कर सकते हैं? –

+0

SQL सर्वर का कौन सा संस्करण आप उपयोग कर रहे हैं? –

+0

2008 या बाद में ठीक –

उत्तर

10

आप निम्न क्वेरी का उपयोग कर सकते हैं:

select ROUTE, StopNumber, ONS, OFFS, SPOT_CHECK, 
     COALESCE(SPOT_CHECK, ONS - OFFS) AS ld, 
     SUM(CASE WHEN SPOT_CHECK IS NULL THEN 0 ELSE 1 END) 
     OVER (PARTITION BY ROUTE ORDER BY StopNumber) AS grp 
from BusLoad 

पाने के लिए:

ROUTE StopNumber ONS OFFS SPOT_CHECK ld grp 
---------------------------------------------------- 
AAAA 1   5 0  NULL  5 0 
AAAA 2   0 0  NULL  0 0 
AAAA 3   2 1  NULL  1 0 
AAAA 4   6 3  8   8 1 
AAAA 5   1 0  NULL  1 1 
AAAA 6   0 1  7   7 2 
AAAA 7   0 3  NULL  -3 2 

तुम सब n चाहते हैं

;WITH CTE AS (
.... 
previous query here 
) 
select ROUTE, StopNumber, ONS, OFFS, SPOT_CHECK, grp, 
     sum(ld) over (PARTITION BY ROUTE, grp ORDER BY StopNumber) as load 
from cte 

Demo here

नोट:: ऊपर क्वेरी 2012 से शुरू होने वाले संस्करणों के लिए काम करता है आप 2008 के लिए एक प्रश्न चाहते हैं तो आप किसी भी तरह के लिए है ow डेटा की ldROUTE, grp से अधिक विभाजन के चल रहे कुल है sum() over (order by ...) अनुकरण करें। आप यहां SO में कई प्रासंगिक पोस्ट पा सकते हैं।

+1

वास्तव में अच्छा एक –

+0

धन्यवाद! आपके तर्क ने मुझे एक समान पायथन पांडस समाधान विकसित करने में मदद की। बहुत बढ़िया! –

2

आप पुनरावर्ती पूछताछ

with act_load as 
(
    select *, ons load 
    from busload 
    where stopnumber = 1 and route = 'AAAA' 
    union all 
    select b.*, case when b.spot_check is null then l.load + b.ons - b.offs 
       else b.spot_check 
       end load 
    from busload b 
    join act_load l on b.StopNumber = l.StopNumber + 1 and 
        b.route = l.route 
) 
select * 
from act_load 
का उपयोग कर सकते

dbfiddle demo

+1

बह! मैं बस इस तरह के एक ही समाधान के लिए आया था लेकिन मुझे 9 मिनट लंबा लगा। – Jamiec

+0

ग्रेट उत्तर, धन्यवाद! –

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