分组两次时将 COUNT 个相加 SQL 服务器
Adding COUNT together when grouping twice SQL Server
我目前有这些结果:
SELECT P.[PersonID], P.PersonName AS [Name], MIN(P.Team) AS [Team],
COUNT( DISTINCT C.CustomerName) AS [Number Of Customers],
SUM(F.Amount) AS [Amount]
FROM Person P
JOIN Figure F on P.PersonID =F.PersonFK
JOIN Customer C ON C.CustomerFK = F.FigureID
GROUP BY P.[PersonID],P.PersonName
order by P.[PersonID]
结果:
PersonID Name Team Number Of Customers Daily Amount
1 Ben 1 3 30
2 Sam 2 2 30
3 Tom 2 3 30
4 Fred 3 3 30
5 Alex 4 3 30
现在我正在使用交叉应用到更多属于团队 2 的人
代码:
SELECT Z.[Person], MIN(P.Team) AS [Team],
COUNT( DISTINCT C.CustomerName) AS [Number Of Customers],
SUM(F.Amount) AS [Amount]
FROM Person P
JOIN Figure F on P.PersonID =F.PersonFK
JOIN Customer C ON C.CustomerFK = F.FigureID
cross apply (values
(case when p.[Team] = '2' then 'Team 2'
ELSE p.PersonName
END)
) AS Z ([Person])
GROUP BY Z.[Person]
order by Z.[Person]
结果:
Person Team Number Of Customers Daily Amount
Alex 4 3 30
Ben 1 3 30
Fred 3 3 30
Team 2 2 3 60
但是,我怎样才能将团队 2 的计数加在一起
例如
Team 2 2 5 60
我知道必须将这一列相加,但我怎样才能在不影响其他计数的情况下做到这一点?到目前为止我还是找不到。谁能帮忙?谢谢
SQL FIDDLE - http://sqlfiddle.com/#!6/546b0/10
代码运行正常,因为您要求的是不同的客户。如果你想要不同的 customer/person 对,那么你需要为此编写逻辑:
select z.[Person], min(p.Team) AS [Team],
count(distinct p.PersonName + ':' + C.CustomerName) as [Number Of Customers],
sum(f.Amount) AS [Amount]
from Person p join
Figure f
on P.PersonID = F.PersonFK join
Customer C
on C.CustomerFK = F.FigureID cross apply
(values (case when p.[Team] = '2' then 'Team 2' else p.PersonName end)
) z (Person)
group by z.[Person]
order by z.[Person] ;
如果 SQL 服务器支持 COUNT(DISTINCT)
的多个参数就好了——就像其他一些数据库一样。将字符串连接在一起应该可以满足您的要求。
Here 就是 SQL Fiddle.
我目前有这些结果:
SELECT P.[PersonID], P.PersonName AS [Name], MIN(P.Team) AS [Team],
COUNT( DISTINCT C.CustomerName) AS [Number Of Customers],
SUM(F.Amount) AS [Amount]
FROM Person P
JOIN Figure F on P.PersonID =F.PersonFK
JOIN Customer C ON C.CustomerFK = F.FigureID
GROUP BY P.[PersonID],P.PersonName
order by P.[PersonID]
结果:
PersonID Name Team Number Of Customers Daily Amount
1 Ben 1 3 30
2 Sam 2 2 30
3 Tom 2 3 30
4 Fred 3 3 30
5 Alex 4 3 30
现在我正在使用交叉应用到更多属于团队 2 的人
代码:
SELECT Z.[Person], MIN(P.Team) AS [Team],
COUNT( DISTINCT C.CustomerName) AS [Number Of Customers],
SUM(F.Amount) AS [Amount]
FROM Person P
JOIN Figure F on P.PersonID =F.PersonFK
JOIN Customer C ON C.CustomerFK = F.FigureID
cross apply (values
(case when p.[Team] = '2' then 'Team 2'
ELSE p.PersonName
END)
) AS Z ([Person])
GROUP BY Z.[Person]
order by Z.[Person]
结果:
Person Team Number Of Customers Daily Amount
Alex 4 3 30
Ben 1 3 30
Fred 3 3 30
Team 2 2 3 60
但是,我怎样才能将团队 2 的计数加在一起
例如
Team 2 2 5 60
我知道必须将这一列相加,但我怎样才能在不影响其他计数的情况下做到这一点?到目前为止我还是找不到。谁能帮忙?谢谢
SQL FIDDLE - http://sqlfiddle.com/#!6/546b0/10
代码运行正常,因为您要求的是不同的客户。如果你想要不同的 customer/person 对,那么你需要为此编写逻辑:
select z.[Person], min(p.Team) AS [Team],
count(distinct p.PersonName + ':' + C.CustomerName) as [Number Of Customers],
sum(f.Amount) AS [Amount]
from Person p join
Figure f
on P.PersonID = F.PersonFK join
Customer C
on C.CustomerFK = F.FigureID cross apply
(values (case when p.[Team] = '2' then 'Team 2' else p.PersonName end)
) z (Person)
group by z.[Person]
order by z.[Person] ;
如果 SQL 服务器支持 COUNT(DISTINCT)
的多个参数就好了——就像其他一些数据库一样。将字符串连接在一起应该可以满足您的要求。
Here 就是 SQL Fiddle.