2

どのようにしてSelect2つの列を作成し、各列で他の列ではなく独自の条件をテストすることができますか?

Countテーブル内のすべてのレコードを選択したとします。1つの列には今週のすべてのレコードが必要で、2番目の列には年初以降のすべてのレコードが必要です。

2つの条件がありますが、それぞれが特定の列に適用されます。

        WHERE date BETWEEN @Monday AND @SUNDAY  /* Weekly */
        WHERE date >= @JanuaryFirst             /* Annual */

しかし、今週のレコードは両方の列でしか取得できないため、このように言うことはできません。条件を使用IFできると思いましたが、「A列の場合はこれをテストし、2番目の列をテストしない場合」と単純に言うことはできないと思います。

ここに画像の説明を入力してください

4

3 に答える 3

4

複数のスキャンを生成しないバージョンは次のとおりです。

select vehicule,
  weekly = SUM(CASE WHEN date BETWEEN @Monday AND @SUNDAY THEN 1 ELSE 0 END),
  annual = SUM(CASE WHEN date >= @JanuaryFirst THEN 1 ELSE 0 END)
from dbo.tablename AS t
GROUP BY vehicule;

または、少し冗長でないものを試すこともできます。

select vehicule,
  weekly = COUNT(CASE WHEN date BETWEEN @Monday AND @SUNDAY THEN 1 END),
  annual = COUNT(CASE WHEN date >= @JanuaryFirst THEN 1 END)
from dbo.tablename AS t
GROUP BY vehicule;
于 2012-06-26T13:22:31.543 に答える
2

次のように、内部選択を使用します。

select vehicule,
       (select count(*) from tablename t1 where t1.vehicule = t.vehicule and date BETWEEN @Monday AND @SUNDAY) as 'Weekly',
       (select count(*) from tablename t1 where t1.vehicule = t.vehicule and date >= @JanuaryFirst) as 'Annual'
from tablename t
于 2012-06-26T13:07:21.607 に答える
2

サブクエリを回避したい場合は、以下を使用できます。

select vehicule,
sum(case when date BETWEEN @Monday AND @SUNDAY then 1 else 0 end)  as 'Weekly',
sum(case when date >= @JanuaryFirst then 1 else 0 end)  as 'Annual' 
group by vehicule
于 2012-06-26T13:21:56.553 に答える