#sql #sql-server #tsql
#sql #sql-сервер #tsql
Вопрос:
У меня есть Dog
таблица. У каждой собаки есть Breed
и может быть от 0 до 2 фотографий. Мне нужно получить количество фотографий всех собак для каждой породы: таблица с BreedId
и сопоставление PhotosCount
. Таким образом, таблица результатов должна быть:
BreedID|PhotosCount
-------------------
1 |3
-------------------
2 |1
-------------------
Комментарии:
1. Подсказка: ГРУППИРУЙТЕ с помощью COUNT() .
2. но откуда берутся столбцы B и C? Это имена собак?
Ответ №1:
Это должно сработать:
SELECT BreedID AS B, COUNT(Photo1) COUNT(Photo2) AS C
FROM Dog
GROUP BY BreedID
COUNT
агрегатная функция просто не учитывает NULL
значения. Если для определенного BreedID
все значения либо Photo1
или Photo2
равны NULL
, то COUNT
возвращается 0
.
Ответ №2:
Это должно работать при одном сканировании:
SELECT
BreedID,
SUM(CASE WHEN Photo1 IS NOT NULL THEN 1 ELSE 0 END)
SUM(CASE WHEN Photo2 IS NOT NULL THEN 1 ELSE 0 END) [Count]
FROM Table
GROUP BY BreedID
Ответ №3:
Используйте группировку и СУММУ Photo1 и Photo2:
Примечание: Если вам нужен вывод для каждого dog, вы должны включить DogId в предложение group.
;WITH T AS
(
SELECT
BreedId,
SUM (CASE ISNULL(Photo1,0) WHEN 1 THEN 1 ELSE 0 END) AS Photo1,
SUM (CASE ISNULL(Photo2,0) WHEN 1 THEN 1 ELSE 0 END) AS Photo2
FROM TableName
Group By BreedId
)
SELECT
BreedId,
SUM(Photo1 Photo2) AS TotalPhoto
FROM T
Или просто
SELECT
BreedId,
SUM (CASE ISNULL(Photo1,0) WHEN 1 THEN 1 ELSE 0 END CASE ISNULL(Photo2,0) WHEN 1 THEN 1 ELSE 0 END) AS TotalPhoto
FROM TableName
Group By BreedId
Комментарии:
1. да, использовать
COUNT
andISNULL
вместе — плохая идея.NULL
в этом случае будут учитываться значения2. И
GROUP BY
два поля тоже неверны 🙂 Вы можете просто проверить правильный ответ выше 🙂3. OP имеет упоминание в требовании для каждой собаки и породы, но в примере показан только breedId, поэтому я включил dog и написал для него заметку
Ответ №4:
SELECT BreedID AS Breed, COUNT(Photo1) COUNT(Photo2) AS #ofPhotos
FROM Dog
GROUP BY BreedID;