7

क्या यह एक या अधिक समूह के साथ स्ट्रिंग को समेकित करना संभव है जैसे कि योग, औसत, गिनती आदि।स्ट्रिंग को अन्य समेकित कार्यों के साथ फ़ंक्शन द्वारा समेकित

मैं निम्न तालिका

Id Name Order Value 
1 a 1  100 
2 b 2  200 
3 c 1  300 
4 d 1  100 
5 e 2  300 

अब अगर मैं परिणाम इस तरह

Order Name Value Count 
1  a,c,d 500 3 
2  b,e 500 2 

के बारे में कुछ कैसे मैं एसक्यूएल सर्वर पर एक क्वेरी का उपयोग कर एक ही प्राप्त कर सकते हैं होने के लिए चाहते हैं।

उत्तर

7

नमूना तालिका

create table t123 (Id int, Name varchar(10), [Order] int, Value int) 
insert t123 select 
1,'a','1',100 union all select 
2,'b','2',200 union all select 
3,'c','1',300 union all select 
4,'d','1',100 union all select 
5,'e','2',300 

SQL सर्वर 2005 के लिए और इसके बाद के संस्करण

select a.[order], STUFF((
    select ','+b.name 
    from t123 b 
    where b.[order] = a.[order] 
    order by b.name 
    for xml path('a'), type).value('.','nvarchar(max)'),1,1,'') Name, 
    SUM(a.value) value, 
    COUNT(*) [count] 
from t123 a 
group by a.[order] 

आउटपुट

order  Name   value  count 
----------- ------------ ----------- ----------- 
1   a,c,d  500   3 
2   b,e   500   2 
+2

यू कृपया व्याख्या कर सकते हैं क्या नरक यहाँ पर जा रहा है .. मेरी मेज नहीं एक असली मेज, इसके परिणामस्वरूप कई तालिकाओं के शामिल होने से सेट किया गया है। – Sarah

4

इस का उपयोग करें।

  • मैंने आपकी मूल क्वेरी को सीटीई में रखा है।
  • फिर मैंने इसे चुना, और आदेश द्वारा समूहीकृत किया।
  • फिर मैं एक सबक्वायरी के साथ लागू हो जाता हूं जो बाहरी क्वेरी में प्रत्येक आदेश के लिए नामों का अल्पविराम-सीमित सेट प्राप्त करता है।
  • चूंकि मैंने नाम कॉलम भी चुना है, इसलिए मुझे नाम कॉलम द्वारा भी समूह करना था।
इस तरह

:

;WITH cte(id, n, o, v) as (
    SELECT Id, Name, Order, Value FROM .... 
) 
SELECT o, names, SUM(v), COUNT(*) 
FROM cte AS outer 
CROSS APPLY (
    SELECT Name+',' 
    FROM cte AS inner 
    WHERE outer.o = inner.o 
    ORDER BY Name FOR XML PATH('') 
) n(names) 
group by o, names 
संबंधित मुद्दे