Heather14637354 Ответов: 2

Запросите эту таблицу, чтобы она подсчитывала повторяющиеся записи?


У меня есть стол, который выглядит так:

ID | ИМЯ | ЗАРАБОТНАЯ ПЛАТА

1 | пол | 30
1 | пол | 30
2 | Сара | 40
2 | Сара | 40
3 | ISLA | 50
1 | пол | 30


Мне нужно создать SQL-запрос, который подсчитает повторяющиеся записи и даст мне результат 3 (2 дополнительных для пола плюс 1 дополнительный для Сары).

Что я уже пробовал:

Я пытался сделать это с помощью инструкции UNION, однако мне неясно, как создать два отдельных запроса, чтобы затем использовать эту инструкцию.

2 Ответов

Рейтинг:
14

Richard Deeming

Чтобы просмотреть дубликаты:

SELECT
    ID,
    NAME,
    WAGE,
    Count(1) - 1 As Extras
FROM
    YourTable
GROUP BY
    ID,
    NAME,
    WAGE
HAVING
    Count(1) > 1
Если вам просто нужно общее количество дополнительных услуг:
WITH cte As
(
    SELECT
        Count(1) - 1 As Extras
    FROM
        YourTable
    GROUP BY
        ID,
        NAME,
        WAGE
    HAVING
        Count(1) > 1
)
SELECT
    Sum(Extras) As TotalExtras
FROM
    cte
;


Heather14637354

Большое спасибо! Могу я спросить, что делает "cte"?

Richard Deeming

Вы также можете написать запрос без него:

SELECT
    Sum(Extras) As TotalExtras
FROM
    (
        SELECT
            Count(1) - 1 As Extras
        FROM
            YourTable
        GROUP BY
            ID,
            NAME,
            WAGE
        HAVING
            Count(1) > 1
    ) As cte
;

Я просто думаю, что версия CTE выглядит более опрятной. :)

MadMyche

+5 Черт возьми, ты меня перепечатал

Maciej Los

5ed!

Рейтинг:
0

MadMyche

Есть пара запросов, на которые я бы посмотрел; ни один из них не будет использовать UNION оператор.

Первый из них будет давать вам именно то, что вы просите, используя CTE (Common Table Expression), заполняемое через a SELECT DISTINCT запрос

DECLARE @Table TABLE ( ID INT, NAM VARCHAR(8), WAGE INT )

INSERT @Table VALUES (1, 'PAUL', 30), (1, 'PAUL', 30), (2, 'SARA', 40), (2, 'SARA', 40), (3, 'ISLA', 50), (1, 'PAUL', 30)

; WITH Dupes AS ( SELECT Distinct Id, Nam, Wage FROM @Table )

SELECT DuplicateRows = 
  (SELECT Count(*) FROM @Table)
- (SELECT Count(*) FROM Dupes)
Второй запрос также может быть полезен, так как он будет определять, какие записи дублируются и сколько дубликатов существует. Это будет сделано с помощью GROUP BY ... HAVING статьи
SELECT   ID, NAM, WAGE
     ,   Duplicates = Count(*) - 1 -- subtract 1 for the original
FROM     @Table
GROUP BY ID, NAM, WAGE
HAVING   COUNT(*) > 1


Maciej Los

5ed!