我有这样一张桌子:
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`x` varchar(45) DEFAULT NULL,
`y` varchar(45) DEFAULT NULL,
`z` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=latin1;
有了这些数据:
INSERT INTO test(id, x, y, z) VALUES (1, '1', 'A', 'A');
INSERT INTO test(id, x, y, z) VALUES (2, '1', 'B', 'B');
INSERT INTO test(id, x, y, z) VALUES (3, '1', 'A', 'B');
INSERT INTO test(id, x, y, z) VALUES (4, '2', 'A', 'A');
INSERT INTO test(id, x, y, z) VALUES (5, '2', 'A', 'A');
INSERT INTO test(id, x, y, z) VALUES (6, '2', 'A', 'A');
INSERT INTO test(id, x, y, z) VALUES (7, '3', 'B', 'A');
INSERT INTO test(id, x, y, z) VALUES (8, '4', 'B', 'B');
INSERT INTO test(id, x, y, z) VALUES (9, '5', 'C', 'C');
INSERT INTO test(id, x, y, z) VALUES (10, '5', 'C', 'C');
INSERT INTO test(id, x, y, z) VALUES (11, '5', 'A', 'B');
我正在寻找什么必须是查询才能得到这个结果:
x y/z count
1 y A 2
1 y B 1
1 z A 1
1 z B 2
2 y A 3
2 z A 3
3 y B 1
3 z A 1
4 y B 1
4 z B 1
5 y C 2
5 y A 1
5 z C 2
5 z B 1
我尝试了很多组合与group by,但我无法获得理想的结果。
我想你想要一个union all
和group by
:
select x, which, val, count(*) as cnt
from ((select x, 'y' as which, y as val from test) union all
(select x, 'z' as which, z as val from test)
) xyz
group by x, which, val;
Here是一个SQL小提琴。
在这里尝试一下。它将为您创建一个表,其中包含两个字段,每个x值都有一行。第一个字段是x值,第二个字段是逗号分隔的y / z组合字符串及其计数。那对你有用吗?
select x, y+','+z combo, count(*) cnt into #A from
test
group by x , y+','+z
select x, combo+','+cast(a.cnt as varchar) data into #B from #A a
Select distinct t2.x,
substring((Select ', '+t1.data
From #b t1
Where T1.x= T2.x
ORDER BY T1.x
For XML PATH ('')),2, 1000) data
From #b T2