Sql 具有多个条件的多个计数列
我有两个表,如下所示: 人民:Sql 具有多个条件的多个计数列,sql,sql-server,count,group-by,multiple-columns,Sql,Sql Server,Count,Group By,Multiple Columns,我有两个表,如下所示: 人民: 1 Andy Relative 2 Jim Friend 3 Anderson Friend 4 Pamela Relative 喜欢: 1 Pizza 1 Soda 2 Pizza 3 Soda 4 Pizza 4 Soda 我需要多个条件的多个计数。如果它只是我正在寻找的一个字符串值,我可以计数(Case…),但我需要包括这个查询,每个id查找两个字符串: 计算比萨饼和苏打水的代码: select
1 Andy Relative
2 Jim Friend
3 Anderson Friend
4 Pamela Relative
喜欢:
1 Pizza
1 Soda
2 Pizza
3 Soda
4 Pizza
4 Soda
我需要多个条件的多个计数。如果它只是我正在寻找的一个字符串值,我可以计数(Case…),但我需要包括这个查询,每个id查找两个字符串:
计算比萨饼和苏打水的代码:
select relation, count(*)
from People p
join likes l1 on l1.id = p.id and pizzavalue = 'Pizza'
join likes l2 on l2.id = p.id and pizzavalue = 'Soda'
group by relation
这给了我:
Relative 2
Friend 0
然后,我需要加入其他列,这些列也根据计数的关系进行分组,比如只计算苏打水和比萨饼。这是预期的结果:
Relation | Pizza and Soda | Pizza Only | Soda Only
Relative 2 2 2
Friend 0 1 1
您可能需要稍微调整连接以获得所需的结果,但这将使您朝着正确的方向前进
select Relationship, Count(l1.Likes) 'Pizza Only', Count(l2.likes) 'Soda Only', Count(PS.Id) 'Both' FROM @People p LEFT Outer join @likes l1 on l1.id = p.id and l1.Likes = 'Pizza' LEFT Outer join @likes l2 on l2.id = p.id and l2.Likes = 'Soda' LEFT Outer JOIN (select p2.Id, Count(distinct(Likes)) count FROM @People p2 INNER JOIN likes l3 ON p2.Id = l3.Id WHERE Likes in ( 'Pizza','Soda') Group by p2.Id Having Count(distinct(Likes))> 1) PS ON p.Id = pS.id GROUP BY RelationShip
这可能有用吗
DECLARE @People TABLE (
Id INT PRIMARY KEY,
Name VARCHAR(50),
Relationship VARCHAR(50));
INSERT INTO @People VALUES (1, 'Andy', 'Relative');
INSERT INTO @People VALUES (2, 'Jim', 'Friend');
INSERT INTO @People VALUES (3, 'Anderson', 'Friend');
INSERT INTO @People VALUES (4, 'Pamela', 'Relative');
DECLARE @Likes TABLE (
Id INT,
Likes VARCHAR(50));
INSERT INTO @Likes VALUES (1, 'Pizza');
INSERT INTO @Likes VALUES (1, 'Soda');
INSERT INTO @Likes VALUES (2, 'Pizza');
INSERT INTO @Likes VALUES (3, 'Soda');
INSERT INTO @Likes VALUES (4, 'Pizza');
INSERT INTO @Likes VALUES (4, 'Soda');
WITH Likes AS (
SELECT
l.Id,
SUM(CASE WHEN l.Likes = 'Pizza' THEN 1 ELSE 0 END) AS Pizza,
SUM(CASE WHEN l.Likes = 'Soda' THEN 1 ELSE 0 END) AS Soda
FROM
@Likes l
GROUP BY
l.Id)
SELECT
p.Relationship,
SUM(CASE WHEN l.Pizza = 1 AND l.Soda = 0 THEN 1 ELSE 0 END) AS PizzaOnly,
SUM(CASE WHEN l.Pizza = 0 AND l.Soda = 1 THEN 1 ELSE 0 END) AS SodaOnly,
SUM(CASE WHEN l.Pizza = 1 AND l.Soda = 1 THEN 1 ELSE 0 END) AS PizzaAndSoda
FROM
@People p
LEFT JOIN Likes l ON l.Id = p.Id
GROUP BY
p.Relationship;
结果:
Relationship PizzaOnly SodaOnly PizzaAndSoda
Friend 1 1 0
Relative 0 0 2
您可以使用
pivot
select *
from
(
select
distinct
p.id,
relation,
(select likes + ' ' from @likes l2 where l2.id=l1.id order by likes for xml path('') ) as likes
from @likes l1
inner join @people p on l1.id = p.id
) s
pivot
(count(id) for likes in ([pizza],[soda],[pizza soda])) p
likes表只有这两个值(比萨饼和苏打水)还是更多?因为如果只有这两个值,就有点容易了,要找到未知的值,你需要实现某种透视表。是的,除了比萨饼和苏打水之外,还有多个值,但这些是我想要的…修复-我说过连接需要调整。。其中,.*代表列名。这似乎完美无瑕,只是我的[pizza soda]返回0。你知道为什么吗?也许是吧?您喜欢列char而不是varchar吗?尝试取出枢轴,并在旋转之前查看结果。