2014-02-25 40 views
0
 SELECT TOP 15 
     us.MxitId AS TransactionCreatedBy, COUNT(t.CreatedBy) Total 
FROM [User] us 
INNER JOIN [Transaction] t ON t.CreatedBy = us.UserId 
Where ChildGender = 'Male' 
GROUP BY us.MxitId, t.ChildGender 
ORDER BY 2 desc 





SELECT TOP 15 
     us.MxitId AS TransactionCreatedBy, COUNT(t.CreatedBy) Total 
FROM [User] us 
INNER JOIN [Transaction] t ON t.CreatedBy = us.UserId 
Where ChildGender = 'Female' 
GROUP BY us.MxitId, t.ChildGender 
ORDER BY 2 desc 

我想將上述兩個過程合併爲一個。將兩個內部連接查詢組合成一個過程

請任何人都可以幫助我,我得到的us.MxitId列的重複值。

Select us.MxitId AS TransactionCreatedBy, 
(SELECT TOP 15 
     COUNT(t.CreatedBy) TotalMale where ChildGender = 'Male') , 

      (Select top 15 COUNT(t.CreatedBy) TotalFemale where ChildGender = 'Female') 


    FROM [User] us 
    INNER JOIN [Transaction] t ON t.CreatedBy = us.UserId 

    GROUP BY us.MxitId, t.ChildGender 
    ORDER BY 2 desc 
+0

你想怎樣把它們結合起來?男孩前15名用戶可能與女孩前15名用戶完全不同。或者,它們可以是相同的列表,但順序不同。告訴我們你想要輸出的樣子。 – Anon

+0

嗨用戶是相同的兩種情況下,我想說如果用戶沒有記錄任何女性數據0,或反之亦然 – vini

回答

1

這個查詢應該努力獲得,而無需重複MxitId的性別統計。

SELECT TOP 15 
     us.MxitId AS TransactionCreatedBy 
, COUNT(t.CreatedBy) AS Total 
, SUM(CASE WHEN ChildGender = 'Female' THEN 1 ELSE 0 END) AS FemaleCount 
, SUM(CASE WHEN ChildGender = 'Male' THEN 1 ELSE 0 END) AS MaleCount 
FROM [User] us 
INNER JOIN [Transaction] t ON t.CreatedBy = us.UserId 
GROUP BY us.MxitId 
ORDER BY 2 desc 
+0

在打字前在評論框中說:請避免評論,如+1和謝謝.. ;-) – NickyvV

0
SELECT TOP 15 
     us.MxitId AS TransactionCreatedBy, 
    sum(case when ChildGender = 'Male' then 1 else 0 end) TotalMale 
     ,sum(case when ChildGender = 'feMale' then 1 else 0 end) TotalFeMale 
FROM [User] us 
INNER JOIN [Transaction] t ON t.CreatedBy = us.UserId 

GROUP BY us.MxitId, t.ChildGender 
+0

消息102,級別15,狀態1,行3 ')'附近的語法不正確。 Msg 102,Level 15,State 1,Line 3 'TotalMale'附近語法不正確。 Msg 102,Level 15,State 1,Line 4 'TotalFeMale'附近語法不正確。 – vini

+0

把末尾放在括號內 – KumarHarsh

+0

嗨數據還在重複 – vini

0

可以使用row_number()做到這一點:

SELECT TransactionCreatedBy, ChildGender, Total 
FROM (SELECT us.MxitId as TransactionCreatedBy, t.ChildGender, COUNT(t.CreatedBy) as Total, 
      row_number() over (partition by t.ChildGender order by COUNT(t.CreatedBy) desc 
           ) as seqnum 
     FROM [User] us INNER JOIN 
      [Transaction] t 
      ON t.CreatedBy = us.UserId 
     GROUP BY us.MxitId, t.ChildGender 
    ) t 
WHERE seqnum <= 15 
ORDER BY Total desc; 

我還添加了性別的select列表,以便您可以看到哪些行來自哪個表。

如果你希望把這兩方面在同一個表,然後通過一些措施取前15:

 SELECT us.MxitId as TransactionCreatedBy, COUNT(t.CreatedBy) as Total, 
      sum(case when t.ChildGender = 'Male' then 1 else 0 end) as TotalMales, 
      sum(case when t.ChildGender = 'Female' then 1 else 0 end) as TotalFemales 
     FROM [User] us INNER JOIN 
      [Transaction] t 
      ON t.CreatedBy = us.UserId 
     GROUP BY us.MxitId, t.ChildGender 
     ORDER BY COUNT(t.CreatedBy) desc 
     LIMIT 15; 
0

寫爲:

select top 15 us.MxitId AS TransactionCreatedBy, 
     count(case ChildGender when 'Male' then 1 else null end) as MaleCount, 
     count(case ChildGender when 'Female' then 1 else null end) as FemaleCount 
from [User] us 
INNER JOIN [Transaction] t ON t.CreatedBy = us.UserId 
GROUP BY us.MxitId