2009-06-29 12 views
7

मैं उदाहरण के लिए BWHourlyReadings नाम के एक तालिका में डेटा का एक सेट है,:मैं दो SQL क्वेरी परिणामों से कॉलम को कैसे जोड़ूं/विलय कैसे करूं?

ServiceID  Hour InputOctets OutputOctets 
=========  ==== =========== ================= 
27222   1  383088   804249 
27222   2  270529   688683 
27222   3  247251   290124 
... up to 24 hours of data 
27222   24  236053   239165 

28900   1  883011   914249 
28900   3  444251   891124 
... up to 24 hours of data 
28900   24  123053   452165 

प्रत्येक दिन के लिए वहाँ ServiceID प्रति 24 रीडिंग करने के लिए कर रहे हैं।

-- Replace HourXIn with HourXOut for OutputOctets 
SELECT ServiceID, [1] AS 'Hour1In', [2] AS 'Hour2In', [3] AS 'Hour3In', ... 
FROM 
(
    SELECT 
     ServiceID, 
     Hour, 
     TotalInputOctets -- Other query has OutputOctets here instead 
    FROM 
     BWHourlyReadings 

) AS bw 
PIVOT 
( 
    MAX(TotalInputOctets) -- Other query has OutputOctets here instead 
    FOR [Hour] IN ([1], [2], [3], ... [24]) 
) AS pvt 

यह मुझे मेरे InputOctets देता है:

मैं (केवल एक यहाँ संक्षिप्तता के लिए दिखाया गया है) के रूप में अब तक के रूप में दो अलग-अलगPIVOT प्रश्नों, InputOctets स्तंभ के लिए और एक OutputOctets स्तंभ के लिए मिल गया है और OutputOctets दो अलग-अलग परिणाम सेट में, उदाहरण के लिए:

InputOctets पर PIVOT क्वेरी परिणाम:

012,351,
ServiceID Hour1In Hour2In Hour3In . Hour24In  
========= ======= ======= ======= ========  
27222  383088 270529 247251 236053 
28900  883011 0  444251 123053 

OutputOctets पर PIVOT क्वेरी परिणाम:

ServiceID Hour1Out Hour2Out Hour3Out .. Hour24Out  
========= ======== ======== ======== ======== 
27222  804249 688683 290124  239165 
28900  914249 0  891124  452165 

मैं इस तरह एक रिपोर्ट बनाने के लिए की जरूरत है:

ServiceID Hour1In Hour1Out Hour2In Hour2Out Hour3In Hour3Out .. Hour24In Hour24Out  
========= ======= ======== ======= ======== ======= ======== ======= ======== 
27222  383088 804249 270529 688683 247251 290124  236053 239165 
28900  883011 914249 0  0  444251 891124  123053 452165 

मैं दो क्वेरी परिणाम कैसे मर्ज ऊपर रिपोर्ट बनाने के लिए करते हैं?

अद्यतन:

मैं स्रोत तालिका उदाहरण में डेटा का मिलान करने के लिए वांछित रिपोर्ट प्रारूप में डेटा को नवीनीकृत किया है। भ्रम के लिए मेरी माफ़ी।

उत्तर

2

सभी परिणामों को मर्ज करने के लिए यूनियन या यूनियन का उपयोग करें। (| आउट) अपने से

+0

बस मुझे एक संयुक्त परिणाम, एक के बाद एक दे देंगे कि । मुझे परिणाम में एक साथ दो स्तंभ सेट मर्ज करने की आवश्यकता है। – Kev

3

मैं पता नहीं आप कैसे अपने HourX गणना है (इनपुट | आउटपुट) ओक्टेट्स लेकिन निम्नलिखित के लिए आप

SELECT 
    ServiceID 
    , [Hour1In] = SUM(CASE WHEN Hour = 1 THEN InputOctets ELSE 0 END) 
    , [Hour1Out] = SUM(CASE WHEN Hour = 1 THEN OutputOctets ELSE 0 END) 
    , [Hour2In] = SUM(CASE WHEN Hour = 2 THEN InputOctets ELSE 0 END) 
    , [Hour2Out] = SUM(CASE WHEN Hour = 2 THEN OutputOctets ELSE 0 END) 
    , [Hour3In] = SUM(CASE WHEN Hour = 3 THEN InputOctets ELSE 0 END) 
    , [Hour3Out] = SUM(CASE WHEN Hour = 3 THEN OutputOctets ELSE 0 END) 
    -- , ... 
    , [Hour24In] = SUM(CASE WHEN Hour = 24 THEN InputOctets ELSE 0 END) 
    , [Hour24Out] = SUM(CASE WHEN Hour = 24 THEN OutputOctets ELSE 0 END) 
FROM 
    @BWHourlyReadings 
GROUP BY 
    ServiceID 

निम्न डेटा के साथ परीक्षण किया गया काम हो सकता है।

DECLARE @BWHourlyReadings TABLE (ServiceID INT, Hour INT, InputOctets INTEGER, OutputOctets INTEGER) 

INSERT INTO @BWHourlyReadings VALUES (27222, 1, 383088, 804249) 
INSERT INTO @BWHourlyReadings VALUES (27222, 2, 270529, 688683) 
INSERT INTO @BWHourlyReadings VALUES (27222, 3, 247251, 290124) 
INSERT INTO @BWHourlyReadings VALUES (27222, 24, 236053, 239165) 
+1

द एवरएक्स (इन | आउट) PIVOT क्वेरी से आते हैं ताकि मुझे कॉलम नाम के रूप में घंटे मिल जाए। हम इनपुट इनपुट के लिए PIVOT का उपयोग करके और फिर आउटपुटऑक्ट्स का उपयोग करके एक अलग परिणाम उत्पन्न कर सकते हैं। – Kev

+0

@ केव, मुझे लगता है कि आपने मुझे गलत समझा। क्वेरी आपको आवश्यक कॉलम का उत्पादन करनी चाहिए। मुझे नहीं पता था कि आप [इनपुटऑक्टेट] 383088 और [आउटपुटऑक्टेट] 80424 9 से [घंटा 1] 350230878 पर कैसे प्राप्त करते हैं। –

+0

माफी लीवन, मैंने डेटा अपडेट किया है और उम्मीद को थोड़ा स्पष्ट रूप से स्पष्ट करने के लिए प्रश्न को फिर से जिंदा कर दिया है। – Kev

-1

इस उत्तर एसक्यूएल प्रश्नों की चंचल/YAGNI स्कूल से आता है .....

रिपोर्ट बिल्कुल इस प्रारूप में होना जरूरी है? एक सरल, अधिक रखरखाव क्वेरी सही जानकारी वापस कर सकती है, इसे सिर्फ थोड़ा अलग प्रस्तुत किया जाएगा। निम्न क्वेरी डेटा को थोड़ा अलग प्रारूप में वापस लाती है?

SELECT serviceid, hour, SUM(InputOctets) AS InputOctets, SUM(OutputOctets) AS OutputOctets 
FROM BWHourlyReadings 
GROUP BY serviceid, hour 
ORDER BY serviceid, hour 
+0

हां डेटा को क्रॉसस्टैब प्रारूप में होना चाहिए। – Kev

0

एक @table चर बनाएँ और उस तालिका में सभी कॉलम डालें और उस तालिका में सभी मान डालें और आखिर में उस तालिका से चुनें। का अर्थ है कि यदि आप 24 कॉलम चाहते हैं तो 24 कॉलम के साथ टेबल बनाएं और

1

अच्छी तरह से आपके पास दो प्रश्न हैं ... इसलिए मुझे लगता है कि आप इन दो प्रश्नों को "टेबल" के रूप में उपयोग कर सकते हैं एक आवरण क्वेरी और उन्हें


select * from 
(*insert your big-ass OutputOctets query SQL here*) oo, 
(*insert your big-ass InputOctets query SQL here*) io 
where oo.ServiceID = oi.ServiceID 

में शामिल होने या अगर आप पसंद करते अंदरूनी शामिल हों का उपयोग करें।यह आपके प्रश्नों से दो विचार बनाने और फिर उन विचारों में शामिल होने के समान ही है।

पुनश्च: नहीं परीक्षण ... सीधे एसक्यूएल के साथ काम करेंगे, लेकिन मैं पिवट तालिका से कोई वास्तविक अनुभव है और उस काटें हो सकता है

+0

यह समाधान काम करेगा लेकिन लाइवन अधिक प्रदर्शनशील और पठनीय है। –

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