Как узнать, имеют ли все ячейки одинаковое значение в каком-либо столбце - PullRequest
6 голосов
/ 23 декабря 2009

Как узнать, имеют ли все ячейки одинаковое значение в некотором столбце (заголовок изменен)

Я хочу иметь немного скалярное значение, которое сообщит мне, все ли значения в столбце равны чему-либо:

DECLARE @bit bit
SELECT @bit = TRUEFORALL(Name IS NOT NULL) FROM Contact

UPDATE

Теперь я понял, что мне на самом деле не нужен TrueForAll, мне нужно убедиться, что все значения в столбце равны, например, я хочу знать, имеют ли все Group.Items одинаковую цену .

Ответы [ 5 ]

14 голосов
/ 23 декабря 2009

Почему бы и нет?

select count( distinct price) from table

Если возвращается 1, все значения одинаковы ... Добавить

where price is not null

при необходимости

5 голосов
/ 23 декабря 2009

Для вашего обновленного требования, что-то вроде этого, похоже, делает то, что вы хотите:

DECLARE @IsSameGroup bit
SELECT @IsSameGroup = CASE WHEN COUNT(*) > 1 THEN 0 ELSE 1 END
FROM (SELECT Name FROM Contact GROUP BY Name) groups

Когда количество больше 1, у вас есть два разных имени (или цены в зависимости от того, на чем вы группируете)

1 голос
/ 23 декабря 2009

Не очень хорошо для NULL, но 2008 может сделать:

SELECT 1 WHERE 'Blue' = ALL ( SELECT Color FROM dbo.Hat )

ИЛИ

DECLARE @bit bit

SET @bit = 
CASE ( SELECT 1 WHERE 'Blue' = ALL ( SELECT Color FROM dbo.Hat ))
WHEN 1 THEN 1 ELSE 0 END 

UPDATE

Все того же цвета

SET @bit = 
CASE(
   SELECT 1 WHERE
  (SELECT TOP(1) Color FROM dbo.Hat) = ALL ( SELECT Color FROM dbo.Hat )
    )
WHEN 1 THEN 1 ELSE 0 END 
1 голос
/ 23 декабря 2009

Может быть, это?

DECLARE @bit bit
if exists(SELECT Name FROM Contact WHERE Name IS NULL) 
   SET @bit = 0
ELSE
  SET @bit = 1
0 голосов
/ 23 декабря 2009

Это решает ваш первый вопрос:

SELECT
    CASE
        WHEN EXISTS(
            SELECT 1
            FROM Contact
            WHERE Name IS NULL
        ) THEN 0
        ELSE 1
    END

ДОБАВЛЕНО:

Это решит ваш второй:

SELECT
    CASE
        WHEN EXISTS(
            SELECT TOP 1 1 FROM (
                SELECT
                    ItemGroupName,
                    COUNT(Price) AS CNT
                FROM ItemGroup
                GROUP BY ItemGroupName
                HAVING COUNT(Price) > 1
            ) t
        ) THEN 0
        ELSE 1
    END

Кстати, когда вы используете функцию Существует, лучше выбрать 1 (константа), чтобы меньше данных возвращалось

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...