2009-08-31 6 views
5

मुझे एक सबक्वायरी से कई परिणाम वापस करने की आवश्यकता है और इसे समझने में असमर्थ रहे हैं। अंतिम परिणाम लंबवत धुरी में व्यक्तियों का नाम, क्षैतिज धुरी में एक क्रिया श्रेणी के आधार पर विभिन्न क्रियाएं उत्पन्न करेगा। तो अंतिम परिणाम इस तरह दिख रहा है:क्या एक सबक्वायरी के साथ कई परिणाम लौटने का कोई तरीका है?

---------- 
**NAME   CATEGORY 1    CATEGORY 2** 

Smith, John  Action 1, Action 2  Action 1, Action 2, Action 3 


---------- 

क्या एक प्रश्न में ऐसा करने का कोई तरीका है?

select 
    name, 
    (select action from actionitemtable where actioncategory = category1 and contact = contactid) 
from 
    contact c 
    inner join actionitemtable a 
    on c.contactid = a.contactid 

एक से अधिक परिणाम यह हुआ कि सबक्वेरी में दिया जाता है अगर मैं एक भी अल्पविराम से अलग स्ट्रिंग, या कार्यों की सूची, आदि

धन्यवाद के रूप में यह प्रदर्शित करने के लिए सक्षम होने के लिए करना चाहते हैं।

माइक्रोसॉफ्ट एसक्यूएल सर्वर 2005 का उपयोग किया जा रहा है।

+0

सहायता के लिए सभी को धन्यवाद, मैं समय की सराहना करता हूं। –

उत्तर

9

मैं इस कार्य के लिए एक उपयोगकर्ता निर्धारित समारोह का उपयोग करें। Udf पैरामीटर से मेल खाने वाले सभी तत्वों के साथ एक सीमांकित स्ट्रिंग बनाता है, फिर आप अपने चयन कथन से udf को कॉल करते हैं जैसे कि आप रिकॉर्डसेट में प्रत्येक रिकॉर्ड के लिए एक सीमित सूची खींचते हैं।

CREATE FUNCTION dbo.ud_Concat(@actioncategory int, @contactid int) 
RETURNS VARCHAR(8000) 
AS 
BEGIN 
    DECLARE @sOutput VARCHAR(8000) 
    SET @sOutput = '' 

    SELECT @sOutput = COALESCE(@sOutput, '') + action + ', ' 
    FROM dbo.actionitemtable 
    WHERE [email protected] AND [email protected] 
    ORDER BY action 

    RETURN @sOutput 
END 

SELECT 
    name, 
    dbo.ud_Concat(category1, contactid) as contactList 
FROM contact c 
INNER JOIN actionitemtable a ON c.contactid = a.contactid 
+0

बहुत सराहना की, धन्यवाद। –

3

आपको अपनी टेबल संरचना और वे एक-दूसरे से कैसे जुड़ते हैं, इसके बारे में अधिक जानकारी देने की आवश्यकता है।

यहाँ एक एकल स्तंभ में एकाधिक पंक्तियों के संयोजन के बारे में एक सामान्य उदाहरण है:

declare @table table (name varchar(30) 
        ,ID int 
        ,TaskID char(3) 
        ,HoursAssigned int 
        ) 

insert into @table values ('John Smith' ,4592 ,'A01' ,40) 
insert into @table values ('Matthew Jones',2863 ,'A01' ,20) 
insert into @table values ('Jake Adams' ,1182 ,'A01' ,100) 
insert into @table values ('Matthew Jones',2863 ,'A02' ,50) 
insert into @table values ('Jake Adams' ,2863 ,'A02' ,10) 


SELECT DISTINCT 
    t1.TaskID 
     ,SUBSTRING(
        replace(
          replace(
            (SELECT 
             t2.Name 
             FROM @Table AS t2 
             WHERE t1.TaskID=t2.TaskID 
             ORDER BY t2.Name 
             FOR XML PATH('')) 
           ,'</NAME>','') 
         ,'<NAME>',', ') 
       ,3,2000) AS PeopleAssigned 
    FROM @table AS t1 

उत्पादन:

TaskID PeopleAssigned 
------ -------------------------------------- 
A01 Jake Adams, John Smith, Matthew Jones 
A02 Jake Adams, Matthew Jones 

(2 row(s) affected) 
0

आपको शायद एक कस्टम समग्र कार्य करना होगा। माइक्रोसॉफ्ट के पास नमूना कोड here के साथ एक ज्ञान आधार आलेख है।

0

यदि आपको कर्सर का उपयोग करने में कोई फर्क नहीं पड़ता है, तो आप ऐसा करने के लिए अपना स्वयं का फ़ंक्शन लिख सकते हैं।

CREATE FUNCTION CommaFunctionSample 
(
    @SalesOrderID int 
) 
RETURNS varchar(max) 
AS 
BEGIN 

DECLARE OrderDetailCursor CURSOR LOCAL FAST_FORWARD 
FOR 
SELECT SalesOrderDetailID 
FROM Sales.SalesOrderDetail 
WHERE SalesOrderID = @SalesOrderID 

DECLARE @SalesOrderDetailID INT 

OPEN OrderDetailCursor 

FETCH NEXT FROM OrderDetailCursor INTO @SalesOrderDetailID 
DECLARE @Buffer varchar(max) 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    IF @Buffer IS NOT NULL SET @Buffer = @Buffer + ',' 
    ELSE SET @Buffer = '' 

    SET @Buffer = @Buffer + CAST(@SalesOrderDetailID AS varchar(12)) 

    FETCH NEXT FROM OrderDetailCursor INTO @SalesOrderDetailID 
END 

CLOSE OrderDetailCursor 
DEALLOCATE OrderDetailCursor 

RETURN @Buffer 
END 

यह कैसे इस तरह के एक समारोह एक का चयन क्वेरी में दिखाई देगी::

SELECT AccountNumber, dbo.CommaFunctionSample(SalesOrderID) 
FROM Sales.SalesOrderHeader 
1

यह सुंदर सार और जटिल है यहाँ एक उदाहरण है कि AdventureWorks नमूना डीबी पर काम करेंगे है। मेरी प्रारंभिक प्रतिक्रिया "पिवट क्वेरी" थी, लेकिन जितना मैंने इसे देखा (और पहले के जवाबों पर) जितना मैंने सोचा था: क्या आप इसे एप्लिकेशन टीम में भेज सकते हैं? आप "बेस" वापस करते हैं, और वे प्रक्रियात्मक कोड लिखते हैं और लागू करते हैं जो इस प्रकार की समस्या को स्नैप बनाता है। निश्चित रूप से, आप इसे एसक्यूएल में निचोड़ सकते हैं, लेकिन यह काम करने के लिए सही जगह नहीं बनाता है।

+0

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

1

आपकी क्वेरी के अनुसार इस प्रयास करें:

SELECT [Name], 
     STUFF(
     (
      SELECT ' ,' + [Action] 
      FROM [AactionItemTable] 
      WHERE [ActionCategory] = category1 
        AND [Contact] = contactid 
      FOR XML PATH('') 
     ), 1, 2, ''     
     ) AS [AdditionalData] 
FROM [Contact] C 
     INNER JOIN [ActionItemTable] A 
     ON C.[ContactId] = A.[ContactId] 

अनुमान आप यही चाहते करने का सबसे आसान तरीका है।

संपादित करें: अगर वहाँ सबक्वेरी पाया में कोई कार्रवाई नहीं की है, [AdditionalData] परिणाम NULL हो जाएगा।

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