2011-05-03 12 views
9

मैं इस एकएसक्यूएल सर्वर क्वेरी बाएं जॉइन, एसयूएम और ग्रुप बाय और मैं स्टंप हो गया हूँ!

के खिलाफ मेरे मस्तिष्क की धड़कन हूँ मैं 3 SQL सर्वर 2005 तालिकाओं

userawards:

id, awardamount, userid, dateawarded, awardtypeid 

उपयोगकर्ता:

id, firstname, lastname 

awardtypes:

id, title 

तो अगर awards तालिका पंक्तियों

1, 300.00, 3, 01-01-2011, 1 
2, 125.00, 3, 01-05-2011, 1 
3, 50.00, 2, 01-05-2011, 2 

उपयोगकर्ता तालिका पंक्तियों

1, john, smith 
2, mark, smith 
3, bob, smith 

पुरस्कार प्रकार

1, cash 
2, prize 

थी और मैं उत्पादन समान देखना चाहते हैं सेवा मेरे इस

bob smith, 425.00, cash 
mark smith, 50, prize 

आदि आदि

एक उपयोगकर्ता कई पुरस्कार हो सकता है, परिणाम अद्वितीय उपयोगकर्ताओं प्रदर्शित करने के लिए की जरूरत है, लेकिन वहाँ कुल पुरस्कार राशि के साथ। इसके अलावा उपयोगकर्ताओं को उपयोगकर्ता नाम और अंतिम प्रकार के शीर्षक में उपयोगकर्ताओं को पहला नाम/आखिरी हड़पने के लिए 2 जोड़ों की आवश्यकता होती है।

तो मेरी क्वेरी (मुझे पता है यह काम नहीं करता) इस तरह लग रही है

SELECT id, userid, awardtypeid, SUM(awardamount) 
FROM awards a 
LEFT JOIN userinfo ui ON ui.userid = a,userid 
LEFT JOIN awardtypes ON awardtypesid = a.awardtypeid 
GROUP BY userid 

यह और भी संभव है?

+1

एक उपयोगकर्ता विभिन्न प्रकार के पुरस्कार के कई है, तो क्या उम्मीद उत्पादन किया जाना चाहिए? – Thomas

+0

यह हमें कुछ नमूना इनपुट और अपेक्षित आउटपुट दिखाने में मदद करेगा। साथ ही, SQL सर्वर का कौन सा संस्करण? – Thomas

+0

आपके पास एक स्थिरता है। एक में, उपयोगकर्ता आईडी – extraneon

उत्तर

16

आप शायद

SELECT userid, 
     awardtypeid, 
     SUM(awardamount) 
FROM awards a 
     LEFT JOIN userinfo ui 
     ON ui.userid = a.userid 
     LEFT JOIN awardtypes 
     ON awardtypesid = a.awardtypeid 
GROUP BY userid, 
      awardtypeid 

या

SELECT userid, 
     SUM(awardamount) 
FROM awards a 
     LEFT JOIN userinfo ui 
     ON ui.userid = a.userid 
     LEFT JOIN awardtypes 
     ON awardtypesid = a.awardtypeid 
GROUP BY userid 

चाहते हैं तो यह आईडी कॉलम (शायद नहीं क्या तुम पर समूह करना चाहते हैं)

पहले मामले में मैं में awardtypeid शामिल चला जाता है चयन करें लेकिन इसका मतलब है कि आपको इसे समूह में भी जोड़ना होगा।

+0

मैं वोट दूंगा लेकिन मेरे पास अभी तक प्रतिनिधि नहीं है .. लेकिन हाँ यह मेरी समस्या हल करता है। धन्यवाद! – Sherdog

+0

+1 जो दिया गया था उसे प्राप्त करने की क्षमता के लिए +1 (और उत्तर के लिए) से वांछित था। – Thomas

+0

धन्यवाद कॉनराड, मैंने आपका जवाब स्वीकार कर लिया है :) उस पर सिर के लिए धन्यवाद .. मैंने चेकमार्क से ठीक पहले देखा। और हाँ स्थिति को समझाने में मेरे बुरे प्रयास के साथ उत्तर देने के लिए धन्यवाद: डी – Sherdog

0

आप इसे कर सकते हैं लेकिन अब आप जिस तरह से करते हैं वह यह है कि यह पुरस्कारमार्ग की संख्या, या व्यावहारिक रूप से, पुरस्कार राशि का योग दिखाएगा - लेकिन प्रति आईडी, उपयोगकर्ता, पुरस्कारप्रवाह संयोजन। सिर्फ बारे में पता होना मात्रा में है कि पुरस्कार की राशि हर awardtypeid

SELECT 
    ??.id , 
    a.userid , 
    a.awardtypeid , 
    ab.awardamount , 
    <whateverelse> 
FROM 
    (select userid, SUM(awardamount) as awardamount FROM awards GROUP BY userid) AS ab 
INNER JOIN awards AS a on ab.userid = a.userid 
LEFT JOIN userinfo AS ui 
    ON ui.userid = a.userid 
LEFT JOIN awardtypes AS at 
    ON awardtypesid = a.awardtypeid 

के लिए दोहराया है प्रति उपयोगकर्ता awardamount की राशि को जोड़कर - इसके बाद आप awardtype आईडी के साथ शामिल होने के उपयोगकर्ता और अपने आप में पुरस्कार की राशि हड़पने के लिए की जरूरत है, इससे पहले कि आप इसमें शामिल हों, आपको किसी भी समूह के बिना, जो भी आप चाहते हैं उसे प्राप्त करने में सक्षम होना चाहिए।

0
SELECT 
    ui.FirstName 
,ui.LastName 
,at.Title AS Award 
,SUM(a.AwardAmount) AS AwardAmount 
FROM Awards a 
    INNER JOIN UserInfo ui ON ui.UserId = a.UserId 
    INNER JOIN AwardTypes at ON at.AwardTypeId = a.AwardTypeId 
GROUP BY ui.FirstName, ui.LastName, at.Title 
ORDER BY ui.LastName, ui.FirstName 
0

यदि मैं इसे सही ढंग से समझता हूं, तो प्रति उपयोगकर्ता एक से अधिक पंक्ति नहीं होनी चाहिए और आपको प्रति उपयोगकर्ता कुल पुरस्कार राशि की आवश्यकता है। दूसरी ओर आप जानना चाहते हैं कि प्रत्येक उपयोगकर्ता के पास किस प्रकार के पुरस्कार थे। आप प्रत्येक उपयोगकर्ता के लिए पुरस्कारों की अल्पविराम से परे सूची दिखाने के लिए कर सकते हैं:

select 
    usr.FirstName, 
    usr.LastName, 
    awd.AwardAmount, 
    AwardTypes = ( 
     select Title + ',' 
     from UserAwards uaw 
      join AwardTypes awt on 
       uaw.AwardTypeId = awt.Id 
     where uaw.UserId = usr.id 
     for xml path('')) 
from [User] usr 
    join (
     select UserId, sum(AwardAmount) AwardAmount 
     from UserAwards uaw 
     group by UserId 
    ) awd on 
     awd.UserId = usr.Id 
संबंधित मुद्दे