में क्रॉसस्टैब के लिए गतिशील रूप से कॉलम उत्पन्न करें, मैं PostgreSQL में crosstab
क्वेरी बनाने की कोशिश कर रहा हूं, जैसे कि यह स्वचालित रूप से हार्डकोडिंग के बजाय crosstab
कॉलम उत्पन्न करता है। मैंने एक ऐसा फ़ंक्शन लिखा है जो गतिशील रूप से कॉलम सूची जेनरेट करता है जिसे मुझे अपने crosstab
क्वेरी के लिए आवश्यक है। विचार इस कार्य के परिणाम को गतिशील एसक्यूएल का उपयोग करके crosstab
क्वेरी में प्रतिस्थापित करना है।PostgreSQL
मुझे पता है कि SQL सर्वर में आसानी से ऐसा कैसे करें, लेकिन PostgreSQL का मेरा सीमित ज्ञान यहां मेरी प्रगति में बाधा डाल रहा है। मैं फ़ंक्शन के परिणाम को संग्रहीत करने के बारे में सोच रहा था जो कॉलम की गतिशील सूची को एक चर में उत्पन्न करता है और इसका उपयोग स्क्वायर क्वेरी को गतिशील रूप से बनाने के लिए करता है। यह अच्छा होगा अगर कोई मुझे इसके बारे में मार्गदर्शन कर सके।
-- Table which has be pivoted
CREATE TABLE test_db
(
kernel_id int,
key int,
value int
);
INSERT INTO test_db VALUES
(1,1,99),
(1,2,78),
(2,1,66),
(3,1,44),
(3,2,55),
(3,3,89);
-- This function dynamically returns the list of columns for crosstab
CREATE FUNCTION test() RETURNS TEXT AS '
DECLARE
key_id int;
text_op TEXT = '' kernel_id int, '';
BEGIN
FOR key_id IN SELECT DISTINCT key FROM test_db ORDER BY key LOOP
text_op := text_op || key_id || '' int , '' ;
END LOOP;
text_op := text_op || '' DUMMY text'';
RETURN text_op;
END;
' LANGUAGE 'plpgsql';
-- This query works. I just need to convert the static list
-- of crosstab columns to be generated dynamically.
SELECT * FROM
crosstab
(
'SELECT kernel_id, key, value FROM test_db ORDER BY 1,2',
'SELECT DISTINCT key FROM test_db ORDER BY 1'
)
AS x (kernel_id int, key1 int, key2 int, key3 int); -- How can I replace ..
-- .. this static list with a dynamically generated list of columns ?
विस्तृत उत्तर @Erwin के लिए धन्यवाद। मैं crosstab क्षेत्रों के एक स्थिर सेट के साथ मूल crosstab काम करने में सक्षम था। मुझे आश्चर्य है कि हमारे पास स्तंभों की सूची को गतिशील रूप से उत्पन्न करने का कोई तरीका नहीं है और इस प्रकार postgresql में गतिशील क्रॉसस्टैब है। क्या पोस्टग्रेस्क्ल में ऐसा करने के बारे में कोई अन्य दौर या हैकी तरीका है जिसे आप जानते हैं? – invinc4u
@ invinc4u: समस्या यह है कि किसी फ़ंक्शन का रिटर्न प्रकार गतिशील रूप से बदला नहीं जा सकता है। आप कार्य को गतिशील रूप से फिर से बना सकते हैं और फिर इसे तुरंत कॉल कर सकते हैं। लेकिन यह मुश्किल व्यवसाय है ... –
हां समझ में आता है। लेकिन मैं वहां उम्मीद कर रहा था कि डायनमिक एसक्यूएल का उपयोग करके कुछ हैकी तरीके से समस्या हल हो गई होगी। गतिशील एसक्यूएल तैयार करने के बाद, हमें केवल क्वेरी निष्पादित करने में सक्षम होना चाहिए और इसे हमारे लिए गतिशील क्रॉसस्टैब उत्पन्न करना चाहिए। उदाहरण के लिए इसे देखें: http://muhammedsalimp.wordpress.com/2010/07/16/dynamic-cross-tab-query-in-sql-server/। मैं पहले से ही अपना एसक्यूएल सर्वर खो रहा हूं :(वैसे भी आपकी मदद और मार्गदर्शन के लिए एक टन धन्यवाद !! – invinc4u