3

できる限り説明しようと思いますが、この問題を説明するどころか、頭全体を包み込むのは難しいです....

データベースの現在のステータスを表示するために、1 つのクエリで複数の結果を選択しようとしています。最初の列をレコードの 1 つのタイプとして、2 番目の列を最初の列のサブカテゴリとして持っています。サブカテゴリは、その下にある他のレコードにリンクされ、ステータスによって区別され、さらにいくつかの列を形成します。すべてのメイン カテゴリとサブカテゴリの組み合わせを表示し、そのサブカテゴリの下にある各サブ ステータスの数を後続の列に表示する必要があります。一意の組み合わせを表示できるようにしましたが、select ステートメントをネストして、メイン クエリとはまったく異なるテーブルのカウントを選択できるようにする方法がわかりません。私の問題は、メイン カテゴリとサブ カテゴリを表示するには、1 つのテーブルから取得できますが、別のテーブルからカウントする必要があることです。

これが私が持っているものです。count ステートメントは、各ステータスのカウントに置き換えられます。

  SELECT wave_num "WAVE NUMBER",
     int_tasktype "INT / TaskType",
     COUNT (1) total,
     COUNT (1) "LOCKED/DISABLED",
     COUNT (1) released,
     COUNT (1) "PARTIALLY ASSEMBLED",
     COUNT (1) assembled
FROM (SELECT DISTINCT
             (t.invn_need_type || ' / ' || s.code_desc) int_tasktype,
             t.task_genrtn_ref_nbr wave_num
        FROM sys_code s, task_hdr t
       WHERE     t.task_genrtn_ref_nbr IN
                    (SELECT ship_wave_nbr
                       FROM ship_wave_parm
                      WHERE TRUNC (create_date_time) LIKE SYSDATE - 7)
             AND s.code_type = '590'
             AND s.rec_type = 'S'
             AND s.code_id = t.task_type),
     ship_wave_parm swp
GROUP BY wave_num, int_tasktype
ORDER BY wave_num

画像はこちら: http://i.imgur.com/JX334.png

4

3 に答える 3

2

あなたの問題とOracle(残念ながら私は一度も使用したことがありません)の両方について少し推測して、うまくいけば、いくつかのアイデアが得られるでしょう。SQL の書き方を完全にめちゃくちゃにして申し訳ありません。

with tmp(int_tasktype, wave_num) as
(select distinct (t.invn_need_type || ' / ' || s.code_desc), t.task_genrtn_ref_nbr  
 from sys_code s 
 join task_hdr t 
   on s.code_id = t.task_type
 where s.code_type = '590' 
   and s.rec_type = 'S'  
   and exists(select 1 from ship_wave_parm p
              where t.task_genrtn_ref_nbr = p.ship_wave_nbr
                and trunc(p.create_date_time) = sysdate - 7))

select t.wave_num "WAVE NUMBER", t.int_tasktype "INT / TaskType",
       count(*) TOTAL,
       sum(case when sst.sub_status = 'LOCKED'    then 1 end) "LOCKED/DISABLED",
       sum(case when sst.sub_status = 'RELEASED'  then 1 end) RELEASED, 
       sum(case when sst.sub_status = 'PARTIAL'   then 1 end) "PARTIALLY ASSEMBLED",
       sum(case when sst.sub_status = 'ASSEMBLED' then 1 end) ASSEMBLED
from tmp t
join sub_status_table sst
  on t.wave_num = sst.wave_num
group by t.wave_num, t.int_tasktype
order by t.wave_num

お気づきのとおり、サブステータスを含むテーブルについては何も知りません。

于 2012-07-25T20:13:02.007 に答える
1

内部結合、グループ化、およびカウントを使用して結果を取得できます。テーブルが次のようになっているとします: cat (1)--->(n) subcat (1)----->(n) subcat_detail. したがって、クエリは次のようになります。

select cat.title cat_title ,subcat.title subcat_title ,count(*) as cnt from
cat  inner join sub_cat  on cat.id=subcat.cat_id
inner join subcat_detail  on subcat.ID=am.subcat_detail_id
group by cat.title,subcat.title
于 2012-07-25T18:57:41.717 に答える
0

通常、異なるカウントが必要な場合は、CASE ステートメントを使用する必要があります。

select count(*) as total
   , case when field1 = "test' then 1 else 0 end as testcount
   , case when field2 = 'yes' then 1 else 0 endas field2count
FROM table1 
于 2012-07-25T18:57:02.013 に答える