1

次の 2 つのクエリを 1 つにマージしようとしています。

select top 100 date, count(*) from sections
where content not like '%some condition%'
group by date
order by date;

select top 100 date, count(*) from sections
group by date
order by date;

この質問のように、GROUP BY の後に LEFT JOIN? ただし、これは MySQL ではなく MS SQL Server で機能する必要があります (違いは、MSSQL では from 句でサブクエリが許可されないことです)。

date結果セットに 、最初のcount(*)、および 2 番目の3 つの列を持たせる方法を探していますcount(*)

私の現在の解決策は次のとおりです。

select top 100 date, 
(select count(*) from sections s1
where content not like '%some condition%' 
and s1.date = s2.date),
(select count(*) from sections s1
where s1.date=s2.date) from sections as s2
group by date
order by date;

これを行うより良い方法はありますか?

4

2 に答える 2

2

これを試して:

with q1 as (select top 100 date, count(*) total from sections
            where content not like '%some condition%'
            group by date),
q2 as (select top 100 date, count(*) total from sections
       group by date)
select q1.date, q1.total total1, q2.total total2
  from q1
  join q2 on q1.date = q2.date
  order by q1.date

アップデート:

またはこれ:

select date,
       count(*) total,
       sum(has_condition) total_condition
from (select top 100 
             date, 
             case when content not like '%some condition%' then 1
                  else 0 end has_condition
        from sections ) t
group by date
order by date;

トライアウトはしませんでしたが、それがアイデアです。

于 2014-11-05T11:23:07.073 に答える
1

これは、1 つの選択だけでジョブを実行するクエリです。

select top 100 date, 
count(*) as count_all,
sum (
  case 
    when content not like '%some condition%' then 1
    else 0
  end
) as count_condition
from sections
group by date
order by date

AdventureWorks2012 データベースからの作業スニペットも貼り付けています

select top 100 
ModifiedDate, 
count(*) as count_all,
sum (
case when CarrierTrackingNumber not like '4911%' then 1
else 0
end
) as count_condition
from [Sales].[SalesOrderDetail]
group by ModifiedDate
order by ModifiedDate

参考までに、SQL Server の FROM 句の後にサブクエリを使用できます。

于 2014-11-05T11:37:42.547 に答える