2

だから私は2つのテーブルを持っています。人々が持っている株式の量を持つもの:

Person_ID ||  Shares
1         ||  100
2         ||  150
3         ||  315
4         ||  75
5         ||  45
...

もう 1 つは、人物が存在するかどうか (それを指定する 2 つの列があります) と、その人物が所属するグループの情報を示します。

Person_id || barcode_presence || manual_presence || group_id
1         || NULL             || 1               || NULL
2         || 1                || NULL            || 1
3         || 1                || 0               || 2
4         || 0                || NULL            || 1
5         || 1                || 0               || 1
...

すべての単一グループ (NULL グループもグループ) の存在するすべての共有の合計と存在しないすべての共有の合計を見つける必要があります。

私が把握できないのは、2 つの列 (barcode_presence と manual_presence) の組み合わせによって、その人が出席しているか不在であるかが判断されることです。

manual_presence = 1 の場合 --> 存在

それ以外の場合 (manual_presence = NULL および barcode_presence = 1) --> 存在

他のすべてはありません。

それが私がこれまでに得たものです。

SELECT  presence_list.Person_id, presence_list.person_name, 
presence_list.barcode_presence, presence_list.manual_presence,
presence_list.group_id, people_data.Share 
, sum(people_data.Share)

FROM presence_list

INNER JOIN people_data
ON presence_list.Person_id = people_data.Person_ID

WHERE meeting_id = 1 AND voting_id = 0 
GROUP BY presence_list.group_id,  
barcode_presence,
manual_presence
ORDER BY presence_list.group_id
;

しかし、明らかにそれは私に望ましい結果を与えません。次のように、group_id、barcode_presence、manual_presence の可能なすべての組み合わせでグループ化します。

Person_id || barcode_presence || manual_presence || group_id || share || sum(shares)
1         || NULL             || 1               || NULL     || 100   || 100
2         || 1                || NULL            || 1        || 150   || 150
4         || 0                || NULL            || 1        || 75    || 75
5         || 1                || 0               || 1        || 45    || 45
3         || 1                || 0               || 2        || 315   || 315

したがって、(この場合) ID 4 と 5 の人を接続する方法を探しています。どちらも不在で、次のように同じグループに属しているためです。

Person_id || barcode_presence || manual_presence || group_id || share || sum(shares)
1         || NULL             || 1               || NULL     || 100   || 100
2         || 1                || NULL            || 1        || 150   || 150
5         || 1                || 0               || 1        || 45    || **120**
3         || 1                || 0               || 2        || 315   || 315

句を使用してHAVINGみましたが、次のような複雑な式を処理する方法が見つかりませんでしたmanual_presence = 1 OR (manual_presence is null AND barcode_presence = 1)

アイデアや提案をいただければ幸いです。事前に感謝します!

4

3 に答える 3

2

2 つの列のうちの 1 つだけにデータを入力できる場合は、coalesce を使用します...

 Group By group_id, Coalesce(barcode_presence, manual_presence)

そうでない場合 (たとえば、barcode_presence = 1 で、presence = 0 にすることはできますか?)、グループ化する値の可能な組み合わせのグループを決定し、それを行う式でグループ化する必要があります...値の組み合わせのグラフを描くと役立つ場合があります...

                barcode value     
 manual     Null      0        1
   Null     GrpA    GrpA     GrpB
     0      GrpC    GrpC     GrpB
     1      GrpB    GrpB     GrpB

両方が 0 であるグループと、その他すべてのグループでグループ化したい場合は、次のように記述します...

 Group By group_id, case When isnull(barcode_presence, 0) = 0 
                          And isnull(manual_presence, 0) = 0 Then 0 Else 1 End
于 2013-02-12T14:20:33.613 に答える
1

a を使用しcaseて、現在の人物とそうでない人物のグループを作成できます。

select  group_id
,       case 
        when barcode_presence = 1 and manual_presence = 1 then 1
        else 0
        end
,       sum(share)
from    presence_list pl
join    people_data pd
on      pl.person_id = pd.person_id
group by 
        group_id
,       case 
        when barcode_presence = 1 and manual_presence = 1 then 1
        else 0
        end
order by 
        group_id
于 2013-02-12T14:20:20.023 に答える
1

私が正しく理解していれば、2 つの列を作成することが道だと思います。

select pd.group_id,
       SUM(isPresent * pd.shares) as PresentShares,
       SUM((1 - isPresent)*pd.shares) as NotPresentShares
from (select pl.*,
             (case when manual_presence = 1 or 
                        manual_precence is null and barcode_presence = 1
                   then 1 else 0
              end) as IsPresent
           end
      from presence_list pl
     ) pl join
     people_data pd
     on pl.Person_id = pd.Person_ID
group by pd.group_id

サブクエリは、ロジックを適用して、存在する場合は 1、存在しない場合は 0 のフラグを作成するだけです。便利なことに、このようにコーディングすると、"1 - IsPresent" は存在しない場合は 1、存在する場合は 0 になります。

この値は、共有を集計する集計で使用されます。外部クエリを次のようにすることができます。

select group_id, IsPresent, sum(pd.shares)
from . . .
group by group_id, IsPresent

別々の行の値が本当に必要な場合。

于 2013-02-12T14:39:14.750 に答える