Количество значений SQL из разных столбцов

#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 and ISNULL вместе — плохая идея. NULL в этом случае будут учитываться значения

2. И GROUP BY два поля тоже неверны 🙂 Вы можете просто проверить правильный ответ выше 🙂

3. OP имеет упоминание в требовании для каждой собаки и породы, но в примере показан только breedId, поэтому я включил dog и написал для него заметку

Ответ №4:

 SELECT BreedID AS Breed, COUNT(Photo1)   COUNT(Photo2) AS #ofPhotos
FROM Dog
GROUP BY BreedID;