10

すべてのセルが一部の列で同じ値を持っているかどうかを知る方法(タイトルが変更されました)

列のすべての値が何かに等しいかどうかを示すビットスカラー値が必要です。

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

アップデート

TrueForAllは実際には必要ないことに気付きました。必要なのは、列のすべての値が等しいことを確認することです。たとえば、すべてのGroup.Itemsの価格が同じかどうかを知りたいです。

4

5 に答える 5

17

なぜだめですか?

select count( distinct price) from table

1 を返す場合、すべての値は同じです... 追加

where price is not null

必要なら

于 2009-12-23T04:13:40.600 に答える
6

更新された要件では、次のようなものが必要なように見えます。

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

カウントが 1 より大きい場合、2 つの異なる名前 (または、グループに応じて価格) があります。

于 2009-12-23T02:04:13.067 に答える
2

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 

アップデート

すべて同じ色

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 
于 2009-12-23T02:27:52.323 に答える
1

多分これ?

DECLARE @bit bit
if exists(SELECT Name FROM Contact WHERE Name IS NULL) 
   SET @bit = 0
ELSE
  SET @bit = 1
于 2009-12-23T01:50:06.343 に答える
0

これはあなたの最初の質問を解決します:

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

追加した:

これはあなたの2番目を解決します:

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

ちなみに、exists関数を使用する場合は、SELECT 1(定数)を使用すると、返されるデータが少なくなります。

于 2009-12-23T01:55:28.120 に答える