2011-09-03 15 views
5

मैं तीन टेबल है:

enter image description here
क्या यह संभव है कि क्वेरी संरचना नीचे की तरह एक ग्रिड प्रदान लिखने के लिए: enter image description here
उदाहरण यहां के लिए डेटाबेस पर डेटा है?

enter image description here
लेखन क्वेरी के साथ परिणाम में शामिल होने के सरल का उपयोग करते हुए यहां की तरह है:

जुड़ें कॉलम SQL क्वेरी

SELECT  dbo.Contact.ContactID, dbo.Contact.ContactName, dbo.PhoneNumber.PhoneNO, dbo.PhoneType.TypeTitle 
FROM   dbo.Contact INNER JOIN 
         dbo.PhoneNumber ON dbo.Contact.ContactID = dbo.PhoneNumber.ContactID AND dbo.Contact.ContactID = dbo.PhoneNumber.ContactID INNER JOIN 
         dbo.PhoneType ON dbo.PhoneNumber.PhoneType = dbo.PhoneType.PhoneTypeI 

enter image description here

+0

मुझे समझ में नहीं आता कि आप क्या पूछ रहे हैं। क्या आप इसे फिर से ले सकते हैं? –

+0

विषय से बाहर: आप जो पूछ रहे हैं वह संभव है। सबसे पहले, क्या यह एक .NET अनुप्रयोग द्वारा उपभोग किया जा रहा है? मैं पूछता हूँ, क्योंकि यह अधिक स्वच्छ होगा LINQ –

+0

@Neil Fenwick में सुर हाँ यह सही है क्या करना है। क्या आप कृपया बताएं कि मैं LINQ का उपयोग करके यह कैसे करूं? की – Shahin

उत्तर

2

धन्यवाद।

कारण मैंने पूछा है कि मुझे नहीं लगता कि डेटाबेस डेटा को बदलने के लिए सबसे अच्छी जगह है। यह नहीं कह रहा कि आपको कभी भी यह नहीं करना चाहिए कि डाटाबेस का उपयोग करने के लिए सबसे अच्छा क्या है: डेटा संग्रहित करना और पुनर्प्राप्त करना, और उपभोग करने वाले कोड में परिवर्तन करना। यह एक सामान्य सिद्धांत है जहां आप कर सकते हैं और अनुसरण कर सकते हैं - यह आपके डेटा को अधिक "कच्चे" प्रारूप में छोड़ देता है और इसलिए बाद में अन्य प्रक्रियाओं द्वारा पुन: प्रयोज्य और उपभोग योग्य होने की संभावना है। संपर्क और ContactType द्वारा

  1. समूह,
  2. और फिर स्थानांतरित & फोन नंबर की अनेक पंक्तियां जोड़:

    अनिवार्य रूप से, मैं इस समस्या से व्याख्या की है कि आप करना चाहते हैं।

मुझे यकीन है कि अपने नेट कोड है कि डेटाबेस कॉल की तरह दिखता है क्या नहीं कर रहा हूँ, लेकिन आप उदाहरण के लिए एक DataTable के साथ निम्न कर सकता है (यह मानते हुए कि आप एक Contact प्रकार की तरह कुछ है):

List<Contact> results = (
    from dataRow in myDataTable.AsEnumerable() 
    let contactData = new { 
          ContactName = dataRow.Field<string>("ContactName"), 
          PhoneType = dataRow.Field<string>("PhoneType"), 
          PhoneNumber = dataRow.Field<string>("PhoneNO") 
         } 
    group contactData by new { contactData.ContactName, contactData.PhoneType } into grp 
    select new Contact { 
      ContactName = grp.Key.ContactName, 
      PhoneType = grp.Key.PhoneType, 
      PhoneNumber = grp.Aggregate((cumulativeText, contact) => String.Format("{0}, {1}", cumulativeText, contact.PhoneNumber)) 
    } 
).ToList(); 

मेरे पास परीक्षण करने के लिए आईडीई नहीं था, इसलिए इसे किसी न किसी कोड के रूप में लें। हालांकि आप इससे सिद्धांत प्राप्त करते हैं।

+0

+1 यह करने के लिए यह सही जगह है। अगर मैं सी # कोड भी प्रदान कर सकता तो मैं +2 होगा। –

+0

धन्यवाद हारून :) –

0

MySQL में, वहाँ एक समारोह GROUP_CONCAT जो आप के लिए यह करना होगा है। AFAIK MSSQL के बराबर नहीं है, लेकिन शायद यह ब्लॉगपोस्ट आपको अपने लक्ष्य के करीब ले जाएगा: http://explainextended.com/2010/06/21/group_concat-in-sql-server/

7

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

प्रयास करें: http://consultingblogs.emc.com/jamiethomson/archive/2009/07/16/string-aggregation-in-t-sql-amp-pl-sql.aspx

या, completists के लिए:

http://www.postgresonline.com/journal/archives/191-stringagg.html

यदि आप पिछले कड़ी में SQL Server के लिए खोज, वहाँ यह करने के लिए तीन अलग-अलग तरीके हैं।

1
select stuff((select distinct ','+ numbers from testtable for xml path('')),1,1,'') 

की पुष्टि इस नेट से भस्म किया जा रहा है के लिए इस कोड का प्रयास करें

1

आप जबकि एक अल्पविराम से अलग सूची में फोन नंबर घूर्णन डेटा को इकट्ठा करने के लिए एक CTE उपयोग कर सकते हैं। यह कुशल नहीं हो सकता है, लेकिन यह एक आसान चाल है।

AdventureWorks2008R2 पर निम्न चलता है, हालांकि आपको व्यक्ति में कुछ अतिरिक्त डेटा भरने की आवश्यकता होगी। व्यक्तिगत फ़ोन नंबर एक व्यक्ति/संख्या प्रकार के लिए एकाधिक फ़ोन नंबर बनाने के लिए।

; with PersonsWithTelephoneNumbersCTE (
    BusinessEntityId, FirstName, MiddleName, LastName, 
    PhoneNumberTypeId, PhoneNumber, PhoneNumbers, Elements) 
as (
    -- Base case: Just the person identifications with all possible phone types. 
    select BusinessEntityID, FirstName, MiddleName, LastName, PhoneNumberTypeId, 
    cast('' as NVarChar(25)), cast('' as VarChar(MAX)), 0 
    from Person.Person as PP cross join 
     Person.PhoneNumberType as PNT 
    union all 
    -- Add a telephone number. 
    select CTE.BusinessEntityId, CTE.FirstName, CTE.MiddleName, CTE.LastName, 
    PNT.PhoneNumberTypeID, PN.PhoneNumber, 
    cast(CTE.PhoneNumbers + ', ' + PN.PhoneNumber as VarChar(MAX)), CTE.Elements + 1 
    from PersonsWithTelephoneNumbersCTE as CTE inner join 
     Person.Person as PP on PP.BusinessEntityID = CTE.BusinessEntityId inner join 
     Person.PhoneNumberType as PNT on PNT.PhoneNumberTypeID = CTE.PhoneNumberTypeId inner join 
     Person.PersonPhone as PN on PN.BusinessEntityID = CTE.BusinessEntityId and PN.PhoneNumberTypeID = PNT.PhoneNumberTypeID 
    where PN.PhoneNumber > CTE.PhoneNumber 
) 
-- Get the person and the longest list of phone numbers for each person/phone type. 
select LastName, FirstName, MiddleName, 
    (select Name from Person.PhoneNumberType where PhoneNumberTypeID = Edna.PhoneNumberTypeID) as PhoneNumberType, 
    substring(PhoneNumbers, 3, len(PhoneNumbers) - 2) as PhoneNumbers from (
    select BusinessEntityID, FirstName, MiddleName, LastName, PhoneNumberTypeId, PhoneNumbers, 
    rank() over (partition by BusinessEntityId, PhoneNumberTypeId order by Elements desc) as Ranking 
    from PersonsWithTelephoneNumbersCTE 
) as Edna 
    where Ranking = 1 and PhoneNumbers <> '' 
    order by LastName, FirstName, MiddleName, PhoneNumberType 
0

हारून के उत्तर पर आधारित सॉर्टा, इस क्वेरी को आजमाएं। इसे उस फ़ॉर्म में एक परिणाम सेट वापस करना चाहिए जिसे आप ढूंढ रहे हैं।

SELECT DISTINCT 
    c.ContactName 
    ,pt.TypeTitle 
    ,(SELECT pn2.PhoneNO + ', ' 
     FROM dbo.PhoneNumber AS pn2 
     WHERE pn.PhoneType = pn2.PhoneType 
      AND pn.ContactID = pn2.ContactID 
     FOR XML PATH ('') 
    ) AS Numbers 
FROM dbo.Contact AS c 
    INNER JOIN dbo.PhoneNumber AS pn 
     ON c.ContactID = pn.ContactID 
    INNER JOIN dbo.PhoneType AS pt 
     ON pn.PhoneType = pt.PhoneTypeID 
संबंधित मुद्दे