2015-07-01 21 views
17

Cho phép nói, chúng tôi có bảng này:Làm thế nào để đếm số lần hai giá trị xuất hiện trong hai cột trong bất kỳ thứ tự

+------+------+ 
| COL1 | COL2 | 
+------+------+ 
| A | B | 
+------+------+ 
| B | A | 
+------+------+ 
| C | D | 
+------+------+ 

tôi muốn đếm số lần hoặc letter1, letter2 hoặc letter2, letter1 xuất hiện trong hai cột.

Tôi muốn kết quả:

+------+------+------+ 
| COL1 | COL2 | COL3 | 
+------+------+------+ 
| A | B | 2 | 
+------+------+------+ 
| C | D | 1 | 
+------+------+------+ 

LƯU Ý: Nó có thể là AB hoặc BA không quan trọng.

tôi đã cố gắng:

SELECT 
COL1,COL1,COUNT(*) AS COL3 
FROM 
X 
GROUP BY COL1,COL2; 

Nhưng mà được tôi:

+------+------+------+ 
| COL1 | COL2 | COL3 | 
+------+------+------+ 
| A | B | 1 | 
+------+------+------+ 
| B | A | 1 | 
+------+------+------+ 
| C | D | 1 | 
+------+------+------+ 
+0

Something tương tự được thực hiện với một "ma trận hiệp phương sai." Tuy nhiên, kết quả sẽ vẫn phải được hợp nhất - tương ứng được thêm vào. – AnyOneElse

Trả lời

15

Bạn có thể làm điều này bằng cách trao đổi các cột nếu bạn cần phải:

SELECT Col1, Col2, COUNT(*) 
FROM 
(
    SELECT 
     CASE WHEN Col1 < Col2 THEN Col1 ELSE Col2 END AS Col1, 
     CASE WHEN Col1 < Col2 THEN Col2 ELSE Col1 END AS Col2 
    FROM T 
) t 
GROUP BY Col1, Col2 

Fiddle

+6

Bạn có thể làm cho nó thanh lịch hơn bằng cách sử dụng 'LEAST',' GREATEST' và loại bỏ truy vấn bên ngoài, như [this] (http://sqlfiddle.com/#!9/7c4f77/3). 1 cho một truy vấn tốt đẹp mặc dù. –

+2

@GiorgosBetsos - Tôi thích viết SQL hoạt động trên tất cả các nền tảng, nếu có thể. –

0

UPDATE:: Câu trả lời Sử dụng @Damien 's. Một lần thử khác.

Bạn có thể thử mã bên dưới. Fiddle

SELECT COL1, COL2, COUNT(*) AS COL3 
    FROM (
    SELECT 
    LEAST(COL1,COL2) AS COL1, 
    GREATEST(COL1,COL2) AS COL2 
    FROM X 
    ) AS Temp 
    GROUP BY COL1,COL2; 
+1

CTE là SQL Server cụ thể. https://msdn.microsoft.com/en-us/library/ms190766.aspx – rurouni88

+1

@ rurouni88 - nó không phải là SQL Server cụ thể. Đó là chuẩn SQL (Oracle và Postgre cũng hỗ trợ nó). Nó chỉ là MySQL không tuân theo tiêu chuẩn ở đây. –

+0

@Damien_The_Unbeliever: Đủ công bằng. Ở mức nào, nó không được hỗ trợ ở đây. Chúng ta đừng làm cho tôi chán nản. Tôi đã dành tuần qua xem xét các nền tảng DB khác nhau triển khai thực hiện RAND() với SEED(): P – rurouni88

-1

Xem http://sqlfiddle.com/#!9/4bd6a/23

Sử dụng câu lệnh if và concat 2 cột.

SELECT 
    DISTINCT (CONCAT(C1,C2)) AS permutation, COUNT(1) 
    FROM (SELECT 
    IF(col1<=col2, col1, col2) as C1, 
    IF(col2<col1, col1, col2) as C2 
    FROM X) AS T 
    GROUP BY permutation 
; 

Tiếp tục giải thích: Các câu lệnh if chỉ đơn thuần là đặt các nhân vật theo giá trị ASCII, vì vậy bất kể 'AB' hoặc 'BA', nó sẽ luôn luôn được biểu diễn dưới dạng 'AB'

+0

Điều đó có thể hoạt động với một giá trị ký tự, nhưng nếu các giá trị thực là 'AA' và 'BB', giá trị này sẽ sai với 'AAB' và 'B'. – abligh

3

Một thử

SELECT LEAST(col1, col2) col11, GREATEST(col1, col2) col12 , COUNT(1) FROM X 
GROUP BY col11, col12 

SqlFiddle

+1

Tôi thích câu trả lời này là tốt nhất. Nó ngắn hơn và dễ đọc hơn nhiều. – AdamMc331

Các vấn đề liên quan