2

給与の範囲に基づいてグループを形成するSQLの次のコードについて考えてみます。

;With TableWithComputedColumn as (
select
computedcolumn =
Case
when Salary<30000 then 'Under 30K'
when Salary>30000 and Salary<60000 then '30K-60K'
else 'Above 60K'
end from Tbl_UserMaster
)
select computedcolumn, COUNT(*)
from TableWithComputedColumn group by computedcolumn

これをMongoで実行したいと思います。CTEの部分では、最初{computed column}に一時コレクションに出力してから、$groupそのコレクションに対してを実行する必要があると思います。別の方法(そして私が好む方法)は、集約パイプラインの最初のストリームとして$projectプロジェクトを作成してから実行することです。{computed column}$group

db.UM.aggregate( {$project: { "computed_column": { //something with $cond}} },
{$group: {_id: {Salary_Slab:"$computed_column"}, count: {$sum:1}}}
);

私が以前に尋ねた同様の質問にも答えてください:

MongoDBの条件付き$sum

それは基本的に私にピボット出力を与えます。この状況では、ピボットされていない出力が必要です。2つを比較するために、他の質問への回答は3つの列を作成します:{30K未満、30K-60K、60Kを超える}、1行のカウントで、30K未満、30K-60K、および60Kを超える場合は3行が必要です1つの列に、それぞれのカウントが2番目の列に表示されます。

4

1 に答える 1

3

あなたは正しい軌道に乗っています。この場合、次$condのように演算子をネストする必要があります。

db.UM.aggregate(
    { $project: {
        computed_column: {$cond: [{$gt: ['$Salary', 30000]},
            {$cond: [{$gt: ['$Salary', 60000]}, 'Above 60K', '30K-60K']},
            'Under 30K']}
    }},
    { $group: {_id: {Salary_Slab: '$computed_column'}, count: {$sum: 1}}})

結果:

[ { _id: { Salary_Slab: 'Above 60K' }, count: 3 },
  { _id: { Salary_Slab: '30K-60K' }, count: 1 },
  { _id: { Salary_Slab: 'Under 30K' }, count: 2 } ]
于 2013-01-08T13:47:03.150 に答える