2012-05-07 37 views
0

我們有2個表分組由SHOPNAME計數不同類型的客戶(會員)的

表1
店,我們有店鋪細節

ShopNo, ShopName 

表2
客戶那裏我們有所有客戶詳細信息

CustomerId, CustomerName, MembershipType, ShopId 

我們試圖查詢什麼是

ShopName SilverMember GoldMember LifeMember 

ABC  45   110  1 

XYZ  90   0   10 

DEF  10   10   7 

有沒有一種方法,以使其能夠

如果Linq中以及和其他良好的只有SQL查詢將提前

問候 莫克沙做的感謝

回答

2

類似這樣的事情應該訣竅:

select s.ShopName, 
     count(c1.CustomerId) as 'SilverMember', 
     count(c2.CustomerId) as 'GoldMember', 
     count(c3.CustomerId) as 'LifeMember' 
from Shop s 
left outer join Customer c1 on c1.ShopId = s.ShopNo and c1.MembershipType = 'SilverMember' 
left outer join Customer c2 on c2.ShopId = s.ShopNo and c2.MembershipType = 'GoldMember' 
left outer join Customer c3 on c3.ShopId = s.ShopNo and c3.MembershipType = 'LifeMember' 
group by s.ShopName 
+0

+1 - 查詢有效 – Habib

0

如果你想使用LINQ:

var query = from s in context.Shops 
      join c in context.Customers on s.ShopNo equals c.ShopId 
      group c by s.ShopName into g 
      select new 
      { 
       ShopName = g.Key, 
       SilverMember = g.Count(c => c.MembershipType == "SilverMember"), 
       GoldMember= g.Count(c => c.MembershipType == "GoldMember"), 
       LifeMember= g.Count(c => c.MembershipType == "LifeMember"), 
      }; 
1

假設MembershipType包含實際VARCHAR值SilverMemberGoldMemberLifeMember,應在T-SQL工作:

SELECT 
    [ShopName], COUNT([SilverMember]) AS [SilverMember], COUNT([GoldMember]) AS [GoldMember], COUNT([LifeMember]) AS [LifeMember] 
FROM 
    [Table1] 
    INNER JOIN [Table2] 
     ON [Table1].[ShopNo] = [Table2].[ShopId] 
    PIVOT 
    (
     MAX([MembershipType]) 
      FOR [MembershipType] IN ([SilverMember], [GoldMember], [LifeMember]) 
    ) AS [P] 
GROUP BY 
    [ShopName] 

Example on SQL Fiddle