2017-03-29 27 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個熱膨脹係數 - 一個組合在一起的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; 
+0

完美,這正是我正在尋找的!謝謝@BeanFrog! – Christa

+0

我將從現在開始添加示例數據代碼!謝謝! – Christa

+0

另外,如果我想彙總並計算有多少客戶和賬戶有這些不同的值,如果我添加一個計數(不同的)到最後一個選擇,它會給我一個錯誤。有關如何做的建議? – Christa

0

爲了讓您的你可以使用下面的查詢,我猜你不希望看到那些在該客戶的所有行上具有相同x,y,z值的客戶。如果是這樣,那麼follwing查詢應該工作。

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

你可以試試這個很長的路要走

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知識,可以短這將是對你有好處。

+0

我認爲他的意思是Count(獨立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)中都有一個唯一的值。它會導致Tableau發出相當於「」組由客戶擁有count(distinct X)= 1的SQL,並且...

如果您的列允許具有空值,並且這會影響您想要的客戶(如果偶爾對Z有一個空值應該排除一個客戶),那麼你可以相應地調整你的條件,比如說使用count()函數或ifnull()函數。