2012-05-17 9 views
6

मैं एक मेज जो वर्तमान में इस-एसक्यूएल - मैं मानों के साथ कॉलम और एक नया प्रारूप के रूप में एक टेबल कैसे बना सकता हूं?

CASEID ¦ FORMNAME ¦ NAME ¦ VALUE 

601554 ¦ CASEFORM ¦ Mond ¦ AAAA 
601554 ¦ CASEFORM ¦ Tues ¦ BBBB 
601554 ¦ CASEFORM ¦ Wedn ¦ CCCC 
601554 ¦ CASEFORM ¦ Thur ¦ DDDD 

मैं अब एसक्यूएल में एक नई तालिका कि डेटा की प्रतिलिपि जाएगा बना सकते हैं और पूरी तरह से इसे का स्वरूप बदलने इस प्रकार

CASEID ¦ FORMNAME ¦ Mond ¦ Tues ¦ Wedn ¦ Thur 

601554 ¦ CASEFORM ¦ AAAA ¦ BBBB ¦ CCCC ¦ DDDD 
के रूप में करना चाहते हैं की तरह एक सा दिखता है

मूल तालिका में लगभग 400 लाइनें हैं, इसलिए नई तालिका को 400 कॉलम की आवश्यकता होगी।

मेरा एसक्यूएल ज्ञान निश्चित रूप से सीमित है, लेकिन जब मुझे एक की आवश्यकता होती है तो मैं हमेशा समाधान के लिए अपना रास्ता भूल सकता हूं। इस मामले में हालांकि मुझे यह भी नहीं पता कि कहां से शुरू करना है। क्या कोई मुझे सही दिशा दिखा सकता है?

+2

एसक्यूएल सर्वर, MySQL, Oracle? – MatBailie

+0

एसक्यूएल सर्वर 2008 –

+0

बस अभी तक पोस्ट करने वाले सभी लोगों के लिए धन्यवाद कहना चाहते हैं। मैं आपके सभी सुझावों पर पढ़ रहा हूं। चीयर्स। –

उत्तर

1

प्रारंभ में पाया जा सकता है:

create table NewTable(CASEID int, FORMNAME varchar(255)) 
go 

insert into NewTable select distinct caseid,formname from OldTable 
go 

select distinct 'alter table NewTable add ' +[name]+ ' varchar(255)' from oldtable 

और फिर परिणामों को कॉपी करें और उन्हें चलाने।

फिर इस क्वेरी चलाने:

select distinct 'update NewTable set ' +Name+ ' = ''' + Value +''' where caseid = ' +cast(caseid as varchar(20))+ 
' and FORMNAME = '''+Formname+'''' 
from oldtable 

और फिर परिणामों को कॉपी करें और उन्हें चलाने।

संपादित करें: जोड़ा गया स्वचालित संस्करण:

create table NewTable(CASEID int, FORMNAME varchar(255)) 
go 
insert into NewTable select distinct caseid,formname from OldTable 
go 
DECLARE @query VARCHAR(max) 
set @query = '' 
select @query = @query + 'alter table NewTable add ' +[name]+ ' varchar(255);' from (select distinct name from oldtable)c 
exec (@query) 
set @query = '' 
select @query = @query+ 'update NewTable set ' +Name+ ' = ''' + Value +''' where caseid = ' +cast(caseid as varchar(20))+ ' and FORMNAME = '''+Formname+'''' 
from (select distinct Name, Value, Caseid, FormName from OldTable)c 
exec (@query) 
+0

यह वास्तव में पूरी तरह से काम करता है धन्यवाद, हालांकि दो मैनुअल तत्व मुझे एक समस्या उत्पन्न करते हैं क्योंकि मुझे पूरी प्रक्रिया को स्वचालित रूप से ट्रिगर करने के लिए स्वचालित करने की आवश्यकता होती है। क्या आप ऐसा करने के लिए एक अच्छा तरीका जानते हैं? मैं ईफॉर्म और वेब सेवाओं के साथ काम कर रहा हूं, और ईफॉर्म जमा करने के बिंदु पर वेब सेवा/संग्रहीत प्रक्रिया के माध्यम से इस प्रक्रिया को ट्रिगर करने की उम्मीद कर रहा था। –

+0

@CraigC इसके बारे में कैसे? – Kevin

+0

इस केविन के लिए आपको बहुत बहुत धन्यवाद, और हर किसी के लिए धन्यवाद। मैंने पहले इस विकल्प पर काम किया था क्योंकि यह एसक्यूएल ज्ञान के अपने स्तर के मामले में सबसे सरल था। खुशी से यह मेरी जरूरत के लिए पूरी तरह से काम किया और अब मुझे अपने संगठन की ईफॉर्म डेटा की रिपोर्टिंग में एक बड़ा अंतर बनाने की अनुमति देगा। –

1

आप मेटामोडेल को परिभाषित कर रहे हैं।

आपको अपने मेटामोडेल टेबल पर लूप करना है और मॉडल कॉलम की आपकी परिभाषा के अनुरूप प्रत्येक पंक्ति के लिए एक कस्टम ALTER कथन बनाना है।

मैं यह भी देखता हूं कि आप मूल्यों को भी बदलना चाहते हैं। यदि ऐसा है, तो फ्लाई पर डीएमएल स्टेटमेंट को उसी लूप में भी बनाएं, और बाद में उन्हें निष्पादित करें ताकि आपका गंतव्य मॉडल समाप्त हो गया हो।

लिंक:

बदलने तालिका mysql: http://dev.mysql.com/doc/refman/5.0/en/alter-table.html

कर्सर mysql: http://dev.mysql.com/doc/refman/5.0/en/cursors.html


दूसरी ओर, इस क्वेरी:

SELECT CONCAT('ALTER TABLE mytable ADD COLUMN ', t.name, ' VARCHAR(256);') FROM mytable t 

वापस आ जाएगी टी वह उन तालिका विवरणों को बदलता है जिन्हें आपको मैन्युअल रूप से इन कॉलम जोड़ने की आवश्यकता होती है। आप इसे बाद में अपनी तालिका में मान जोड़ने के लिए अगली क्वेरी बनाने के लिए मॉडल के रूप में उपयोग कर सकते हैं।

आरजीडीएस।

1

एसक्यूएल सर्वर के लिए पिवट सुविधा को देखना चाह सकता है। एक नमूना है जो आपके परिदृश्य से मेल खाता है और आपके इच्छित परिणामों को आउटपुट करता है ...

declare @data table (CASEID int, FORMNAME varchar(20), NAME varchar(20), VALUE varchar(20)) 
insert into @data values 
(601554, 'CASEFORM', 'Mond', 'AAA'), 
(601554, 'CASEFORM', 'Tues', 'BBB'), 
(601554, 'CASEFORM', 'Wedn', 'CCC'), 
(601554, 'CASEFORM', 'Thur', 'DDD') 

SELECT * 
FROM @data 
PIVOT 
(
    MAX(VALUE) 
    FOR [NAME] IN ([Mond],[Tues],[Wedn],[Thur]) 
) 
AS data 
+0

केवल इस समस्या के साथ मुझे समस्या है कि उसे 400 कॉलम नाम टाइप करना होगा – Kevin

+0

आप उन्हें क्यों टाइप करेंगे? मैं विजुअल स्टूडियो रेगेक्स सर्च और रीप्लेस फीचर का उपयोग करूंगा। मैं एक उत्तर अद्यतन प्रदान करूंगा ... –

+0

@rs ने मुझे भी हराया –

0

आईएमएचओ, यह वास्तव में अजीब आवश्यकता है! कहा जा रहा है कि, आपको जो चाहिए वह एक मुख्य प्रश्न है। विवरण इस क्वेरी के साथ Ask Tom - Pivot Query

+0

यह एक अजीब बात है। मैं वास्तव में अजीब प्रणाली में वास्तव में अजीब तालिका से डेटा को पट्टी करने की कोशिश कर रहा हूं, और इसे व्यवसाय ऑब्जेक्ट्स ब्रह्मांड में डाल करने के लिए उपयोग करने योग्य प्रारूप में लाने की कोशिश कर रहा हूं। –

1

आप आप इस का उपयोग कर सकते स्तंभों की सही संख्या पता नहीं है:

DECLARE @columns varchar(max) 
DECLARE @query VARCHAR(max) 
SELECT @columns = COALESCE(@columns + ',[' + cast([Name] as varchar(100)) + ']', 
       '[' + cast([Name] as varchar(100))+ ']')   
    FROM @data1 

SET @query = 'SELECT * FROM @data1 ' 
SET @query = @query + '    
      PIVOT 
      (
       MAX(VALUE) FOR [NAME] IN (' + @columns + ') 
      ) 
      AS p'         

EXEC @query 
संबंधित मुद्दे