0

特定の要因に基づいて、テーブルからいくつかのレコードを取得しようとしています。

要因の 1 つは単に同じテーブルのフィールドを使用することであり、もう 1 つは別のテーブルに結合する場合です。結合したテーブルのレコード数を最初のテーブルのフィールドと比較したいと考えています。以下はサンプルコードです。

select * from tDestinations D 
left join tLiveCalls LC on LC.DestinationID = D.ID 
where D.ConfigurationID = 1486 
AND (D.Active = 1 AND D.AlternateFail > GETDATE())
-- Having COUNT(LC.ID) = D.Lines

上記のコードから、where 句に Count 関数を含めることはできず、having 句にフィールドを含めることはできません。

私はおそらくここで非常に単純なものを見逃しています。しかし、私はそれを理解することはできません。

どんな助けでも大歓迎です。

編集: テーブルの構造を説明する必要がありました。Destinations は単一のレコードであり、LiveCalls テーブルは Destinations ID (外部キー) に基づいて複数のレコードを保持できます。

皆様のご協力に心より感謝申し上げます。私の最終的なコード:

select D.ID, D.Description, D.Lines, D.Active, D.AlternateFail, D.ConfigurationID, COUNT(LC.ID) AS LiveCalls from tDestinations D 
left join tLiveCalls LC on LC.DestinationID = D.ID 
where D.ConfigurationID = @ConfigurationID
AND (D.Active = 1 AND D.AlternateFail > GETDATE())
GROUP BY D.ID, D.Description, D.Lines, D.Active, D.AlternateFail, D.ConfigurationID
HAVING COUNT(LC.ID) <= D.Lines
4

2 に答える 2

2

あなたが見逃している簡単なことはステートメントGROUP BYです

以下のコメントで JNK が述べているように、ステートメントがリテラル値のみを参照する (列名を参照しない) 場合を除き、句がない場合は集計関数 ( COUNTAVG、 、SUMなど) を使用できません。MINGROUP BYSELECT

コードはおそらく次のようになります。

SELECT <someFields>
FROM tDestinations D 
LEFT JOIN tLiveCalls LC on LC.DestinationID = D.ID 
WHERE D.ConfigurationID = 1486 
AND (D.Active = 1 AND D.AlternateFail > GETDATE())
GROUP BY <someFields>
HAVING COUNT(LC.ID) = D.Lines

SELECT ステートメントと GROUP BY ステートメントの両方で、選択したフィールドを明示的に指定する必要があることに注意してください (許可されていません*)。

于 2012-04-11T14:43:07.613 に答える
1

集計でのみ having を使用できます。実際には集計の「where句」がありますが、集計していない列のどこにでも置くことができます。

例えば:

SELECT TABLE_TYPE, COUNT(*)
FROM INFORMATION_SCHEMA.TABLES
where TABLE_TYPE='VIEW'
group by TABLE_TYPE
having COUNT(*)>1

あなたの場合、havving count(*)=1 を使用する必要があるため、クエリは次のようになると思います。

select YOUR_COLUMN 
from tDestinations D 
left join tLiveCalls LC on LC.DestinationID = D.ID 
where D.ConfigurationID = 1486 AND (D.Active = 1 AND D.AlternateFail > GETDATE())
group by YOUR_COLUMN
Having COUNT(LC.ID) = value
于 2012-04-11T14:49:59.293 に答える