我在Server中有一个表,我需要查找行中具有不同值的客户和帐户的数量。
例如
Customer Account X Y Z
-------------------------------
A 001 X1 Y1 Z1
A 002 X2 Y1 Z1
A 003 X1 Y1 Z1
B 004 X3 Y2 Z2
B 005 X4 Y2 Z2
C 006 X5 Y3 Z3
C 007 X5 Y3 Z3我希望结果是不同X,Y,Z的客户数量是2,受影响的帐户数是5。
Customer Account X Y Z
-------------------------------
A 001 X1 Y1 Z1
A 002 X2 Y1 Z1
A 003 X1 Y1 Z1
B 004 X3 Y2 Z2
B 005 X4 Y2 Z2发布于 2017-03-29 14:51:23
首先,这里是一些示例数据--如果您提出任何进一步的sql问题,请这样做:
declare @table table (Customer char(1), Account char(3), X char(2), Y char(2), Z char(2));
insert into @table values
('A', '001', 'X1', 'Y1', 'Z1'),
('A', '002', 'X2', 'Y1', 'Z1'),
('A', '003', 'X1', 'Y1', 'Z1'),
('B', '004', 'X3', 'Y2', 'Z2'),
('B', '005', 'X4', 'Y2', 'Z2'),
('C', '006', 'X5', 'Y3', 'Z3'),
('C', '007', 'X5', 'Y3', 'Z3');创建2 ctes -一个用于为每个客户组合您的X、Y、Z列,另一个用于查看您有多少不同的组(每个客户)。
然后从原始表中选择所有信息,并在cte2上进行内部连接,仅限于重复的不匹配行的客户。
with cte as (
select Customer, X, Y, Z from @table
group by Customer, X, Y, Z
), cte2 as (
select Customer, COUNT(*) groups
from cte
group by Customer
)
select t.Customer, t.Account, t.X, t.Y, t.Z
from @table t
inner join cte2 on t.Customer = cte2.Customer
where cte2.groups >1;发布于 2017-03-29 14:39:18
要获得您的disired结果,您可以使用以下查询,我猜您不希望看到在该客户的所有行上具有相同x、y、z值的客户。如果是这样的话,折叠查询应该可以工作。
SELECT t.*
FROM <table> AS t INNER JOIN
(
SELECT DISTINCT customer
FROM <table>
GROUP BY customer, x,y,z
HAVING COUNT(*) < 2
) AS difacc
ON difacc.customer = t.customer结果
Customer Account X Y Z
A 001 X1 Y1 Z1
A 002 X2 Y1 Z1
A 003 X1 Y1 Z1
B 004 X3 Y2 Z2
B 005 X4 Y2 Z2发布于 2017-03-29 14:55:52
你可以试试这么长的路
SELECT * FROM CUST WHERE CUSTOMER in (SELECT CUSTOMER FROM CUST
GROUP BY CUSTOMER, X, Y, Z
HAVING COUNT(X)=1 AND COUNT(Y)=1 AND COUNT(Z)=1)如果任何一个有良好sql知识的人都能缩短时间,那将对你有好处。
https://stackoverflow.com/questions/43096278
复制相似问题