2017-03-29 18 views
1

SQL Serverにテーブルがあり、その行全体で異なる値を持つ顧客とアカウントの数を見つける必要があります。例えばSQL Serverの複数列(10以上)の重複行の数

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 
+0

Cだけでなく、002,004,005,006,007のX、Y、Zの値が異なる –

+0

@RajenRaiyarela私はもう一度それを見てから理解していると思います。顧客列のみのXYZ値はC値と同じです。 A顧客は異なるXYZ値を持ち、Bも同様です。アカウント値を無視します。 – dfundako

+1

私はここで論理を理解していません。 –

答えて

0

まず、いくつかのサンプルデータである - あなたが求めるあらゆるさらに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つのCTEを作成 - グループに1を一緒にあなたのXを、Y、Z列を表示し、次のグループ(お客様1人あたり)の数を表示します。

元のテーブルからすべての情報を選択し、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; 
+0

パーフェクト、これはまさに私が探していたものです!ありがとう@BeanFrog! – Christa

+0

サンプルデータコードを追加します!ありがとう! – Christa

+0

また、これらの異なる値を持つ顧客とアカウントの数を集計してカウントする場合、最後の選択にカウント(別名)を追加するとエラーになります。どのようにそれを行うにはどのような提案? – Christa

0

です私はあなたがその顧客のすべての行にわたって同じ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 
0

良いSQLの知識を持つ人は短い、それはあなたのために良いだろうことができます場合は、この長い道のり

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) 

を試すことができます。この上

+0

私は彼がCount(distinct x)などを意味すると思う –

0

私のテイク:タブローで

select * 
from <table> 
where customer in (
    select customer 
    from <table> 
    group by customer, concat(x,y,z) 
    having count(concat(x,y,z)) = 1 
       ) 
0

は、フィルタの棚に顧客を置き、フィルタの条件]タブで、条件の顧客のみが含まれますcountd([X]) = 1 and countd([Y]) = 1 and countd([Z]) = 1

を入力してください誰のみあなたが言及した各列(X、Y、Z)に固有の値が1つあります。それはあなたの列がNULL値を持つことが許可されている場合はタブローは、「顧客がグループは、カウント(個別のX)を有する= 1、...

と同等であるSQLを発光させると、それは顧客が何をしたい影響を及ぼす場合に(たとえば、Zのnull値を持つことによって顧客を除外する必要があるとしたら)count()関数またはifnull()関数を使用して条件を調整することができます。

関連する問題