जवाबों:
select id, group_concat(`Name` separator ',') as `ColumnName`
from
(
select
id,
concat(`Name`, ':', group_concat(`Value` separator ',')) as `Name`
from mytbl
group by
id,
`Name`
) tbl
group by id;
आप इसे यहाँ लागू देख सकते हैं: Sql Fiddle Demo । बिल्कुल वही जो आपको चाहिए।
दो चरणों में विभाजन को अद्यतन करें। पहले हमें एक यूनीक [नेम, आईडी] के खिलाफ सभी मान (अल्पविराम से अलग) वाली तालिका मिलती है। फिर प्राप्त तालिका से हम सभी नामों और मूल्यों को प्रत्येक अद्वितीय आईडी के खिलाफ एक एकल मान के रूप में प्राप्त करते हैं इसे यहां देखें एसक्यूएल फिडेल डेमो (नीचे दो परिणाम सेट के रूप में स्क्रॉल करें)
संपादित करें पढ़ने के प्रश्न में एक गलती थी, मुझे केवल आईडी द्वारा समूहीकृत किया गया था। लेकिन दो group_contacts की जरूरत है अगर (मान नाम और आईडी द्वारा समूहीकृत किया जाना है और फिर आईडी से अधिक है)। पिछला उत्तर था
select
id,group_concat(concat(`name`,':',`value`) separator ',')
as Result from mytbl group by id
आप इसे यहां लागू देख सकते हैं: SQL फिडेल डेमो
GROUP_CONCAT
चुपचाप इसके उत्पादन को कम कर सकते हैं group_concat_max_len
। SET group_concat_max_len=...
मदद करेगा, लेकिन यह जांचने के लिए एक अच्छा विचार है कि लौटे (बाइट?) की लंबाई की तुलना में कम है group_concat_max_len
।
प्रयत्न:
CREATE TABLE test (
ID INTEGER,
NAME VARCHAR (50),
VALUE INTEGER
);
INSERT INTO test VALUES (1, 'A', 4);
INSERT INTO test VALUES (1, 'A', 5);
INSERT INTO test VALUES (1, 'B', 8);
INSERT INTO test VALUES (2, 'C', 9);
SELECT ID, GROUP_CONCAT(NAME ORDER BY NAME ASC SEPARATOR ',')
FROM (
SELECT ID, CONCAT(NAME, ':', GROUP_CONCAT(VALUE ORDER BY VALUE ASC SEPARATOR ',')) AS NAME
FROM test
GROUP BY ID, NAME
) AS A
GROUP BY ID;
एसक्यूएल फिडल: http://sqlfiddle.com/# -2 / b5abe/9 /0
SELECT ID, GROUP_CONCAT(CONCAT_WS(':', NAME, VALUE) SEPARATOR ',') AS Result
FROM test GROUP BY ID
सबसे पहले, मुझे एक आईडी होने का कारण नहीं दिख रहा है जो अद्वितीय नहीं है, लेकिन मुझे लगता है कि यह एक आईडी है जो किसी अन्य तालिका से जुड़ती है। दूसरा, उपश्रेणियों की कोई आवश्यकता नहीं है, जो सर्वर को धड़कता है। आप ऐसा एक क्वेरी में करते हैं
SELECT id,GROUP_CONCAT(name, ':', value SEPARATOR "|") FROM sample GROUP BY id
आपको तेजी से और सही परिणाम मिलते हैं, और आप उस SEPARATOR द्वारा परिणाम विभाजित कर सकते हैं "|" मैं हमेशा इस विभाजक का उपयोग करता हूं, क्योंकि इसे स्ट्रिंग के अंदर ढूंढना असंभव है, इसके लिए यह अद्वितीय है। दो ए होने से कोई समस्या नहीं है, आप केवल मूल्य की पहचान करते हैं। या आपके पास पत्र के साथ एक और कोलम हो सकता है, जो और भी बेहतर है। ऐशे ही :
SELECT id,GROUP_CONCAT(DISTINCT(name)), GROUP_CONCAT(value SEPARATOR "|") FROM sample GROUP BY name
SELECT id, GROUP_CONCAT(CONCAT_WS(':', Name, CAST(Value AS CHAR(7))) SEPARATOR ',') AS result
FROM test GROUP BY id
आपको कास्ट या कन्वर्ट का उपयोग करना चाहिए, अन्यथा बीएलओबी वापस कर दिया जाएगा
परिणाम है
id Column
1 A:4,A:5,B:8
2 C:9
आपको अजगर या जावा जैसे प्रोग्राम द्वारा एक बार फिर से परिणाम को संभालना होगा
IF OBJECT_ID('master..test') is not null Drop table test
CREATE TABLE test (ID INTEGER, NAME VARCHAR (50), VALUE INTEGER );
INSERT INTO test VALUES (1, 'A', 4);
INSERT INTO test VALUES (1, 'A', 5);
INSERT INTO test VALUES (1, 'B', 8);
INSERT INTO test VALUES (2, 'C', 9);
select distinct NAME , LIST = Replace(Replace(Stuff((select ',', +Value from test where name = _a.name for xml path('')), 1,1,''),'<Value>', ''),'</Value>','') from test _a order by 1 desc
मेरी तालिका का नाम परीक्षण है, और सहमति के लिए मैं फॉर XML पथ ('') सिंटैक्स का उपयोग करता हूं। सामान फ़ंक्शन एक स्ट्रिंग को दूसरे स्ट्रिंग में सम्मिलित करता है। यह प्रारंभ की स्थिति में पहले स्ट्रिंग में वर्णों की एक निर्दिष्ट लंबाई को हटाता है और फिर शुरू की स्थिति में दूसरे स्ट्रिंग को पहले स्ट्रिंग में सम्मिलित करता है।
STUFF फ़ंक्शंस इस तरह दिखाई देते हैं: STUFF (character_expression, start, length, character_expression)
character_expression चरित्र डेटा की एक अभिव्यक्ति है। character_expression किसी वर्ण या बाइनरी डेटा का एक स्थिर, परिवर्तनशील या स्तंभ हो सकता है।
प्रारंभ एक पूर्णांक मान है जो विलोपन और सम्मिलन शुरू करने के लिए स्थान निर्दिष्ट करता है। यदि प्रारंभ या लंबाई ऋणात्मक है, तो एक नल स्ट्रिंग वापस आ जाती है। यदि प्रारंभ पहले character_expression से अधिक लंबा है, तो एक नल स्ट्रिंग लौटा दी जाती है। स्टार्ट टाइप बिगिंट का हो सकता है।
लंबाई एक पूर्णांक है जो वर्णों की संख्या को हटाने के लिए निर्दिष्ट करता है। यदि लंबाई पहले character_expression से अधिक है, तो अंतिम वर्ण_expression में अंतिम वर्ण तक विलोपन होता है। लंबाई टाइप बिगिंट की हो सकती है।
Select id, Group_concat ( column
) FROM ( Select id, Concat ( name
, ':', Group_concat ( value
)) AS column
से mytbl Group के द्वारा id, नाम) tbl Group by id;