0

次のOracleクエリがあります:

SELECT distinct  DM.name,
    ND.param5 ,
    ND.param4 ,  
      DECODE(ND.param3, 'TRS01','Mark for Return to warehouse',
'TRS02','Waiting for distributor approval on return',
'TRS03','Waiting for Service Provider approval on return',
'TRS04','Return to Distributor',
'TRS05','Return to Warehouse',
'TRS06','Mark for Return to Distributor',
'TRS08','Quarantined',
'TRS10' ,'New',
'TRS11','Waiting for Distributor acceptance',
'TRS12' ,'Moved to distributor warehouse',
'TRS13','Waiting for reseller acceptance',
'TRS14','Moved to reseller warehouse',
'TRS15','In-Use', 
'TRS16','Returned',
'TRS17','Deattached',
'TRS18','Sold'),   NS.name ,
    COUNT( distinct ND.NUMBERDETAILID) serialcount,ND.param3,'ALL',
   FROM ndetail ND,
    nbatch NB,
    nstatus NS,
    dynamicmaster DM,(select his.createdate,h.numberdetailid,his.numberstatusid,his.param3,his.actualnumber 
from ndetailhistory his,
(select max(createdate) createdate,numberdetailid 
from ndetailhistory 
group by numberdetailid) h 
where h.numberdetailid = his.numberdetailid
and h.createdate = his.createdate) NDH
  WHERE ND.numberbatchid = NB.numberbatchid
  AND NS.numberstatusid  = ND.numberstatusid
  and DM.DYNAMICMASTERID = NB.WAREHOUSEID
  and NDH.actualnumber = ND.actualnumber
  and ND.NUMBERDETAILID = NDH.NUMBERDETAILID
  and NB.numbergroupid = (select numbergroupid from ngroup where alias = 'TEST')
  AND (case when 'ALL'='ALL' THEN '1' ELSE  ND.PARAM3 END ) =(case when 'ALL'='ALL' THEN '1' ELSE  'ALL' END )
  GROUP BY DM.name,ND.param5,ND.param4,ND.param3,NS.name
order by 1,3,2

選択リストにもcreatedateが必要ですが、createdateでグループ化したくありません。

どうすればこれを達成できますか?

4

2 に答える 2

0

GROUP BY を使用する場合、SELECT リストのフィールドを GROUP BY ステートメントまたは集計関数に含める必要があります。したがって、それを GROUP BY に含めたくない場合は、たとえばMAX(createdate)を SELECT リストに追加するだけです。

于 2012-11-30T06:59:24.437 に答える
0

選択リスト内のすべての非集計列は、GROUP BY 句にリストする必要があります。メインの select-list の DECODE にも (まだ) エイリアスがないため、非常に難しくなっています。

SELECT DISTINCT DM.name,
       ND.param5,
       ND.param4,  
       DECODE(ND.param3, 'TRS01','Mark for Return to warehouse',
                         'TRS02','Waiting for distributor approval on return',
                         'TRS03','Waiting for Service Provider approval on return',
                         'TRS04','Return to Distributor',
                         'TRS05','Return to Warehouse',
                         'TRS06','Mark for Return to Distributor',
                         'TRS08','Quarantined',
                         'TRS10' ,'New',
                         'TRS11','Waiting for Distributor acceptance',
                         'TRS12' ,'Moved to distributor warehouse',
                         'TRS13','Waiting for reseller acceptance',
                         'TRS14','Moved to reseller warehouse',
                         'TRS15','In-Use', 
                         'TRS16','Returned',
                         'TRS17','Deattached',
                         'TRS18','Sold')
       decoded_param3,
       NS.name,
       COUNT(DISTINCT ND.NUMBERDETAILID) serialcount,
       ND.param3,
       'ALL' all_code
  FROM ndetail ND,
       nbatch NB,
       nstatus NS,
       dynamicmaster DM,
       (SELECT his.createdate, h.numberdetailid, his.numberstatusid, his.param3,
               his.actualnumber 
          FROM ndetailhistory his,
               (SELECT MAX(createdate) createdate, numberdetailid 
                  FROM ndetailhistory 
                 GROUP BY numberdetailid) h 
         WHERE h.numberdetailid = his.numberdetailid
           AND h.createdate = his.createdate) NDH
 WHERE ND.numberbatchid   = NB.numberbatchid
   AND NS.numberstatusid  = ND.numberstatusid
   AND DM.DYNAMICMASTERID = NB.WAREHOUSEID
   AND NDH.actualnumber   = ND.actualnumber
   AND ND.NUMBERDETAILID  = NDH.NUMBERDETAILID
   AND NB.numbergroupid  = (SELECT numbergroupid FROM ngroup WHERE alias = 'TEST')
   AND (CASE WHEN 'ALL'='ALL' THEN '1' ELSE ND.PARAM3 END) =
       (CASE WHEN 'ALL'='ALL' THEN '1' ELSE 'ALL'     END)
 GROUP BY DM.name, ND.param5, ND.param4, decoded_param3, NS.name, ND.param3, all_code
 ORDER BY 1,3,2

「テーブル」と呼ばれるこれらの素晴らしいものについて学ぶ必要があります。これにより、データベース内の ND.param3 ルックアップなどの DECODE 操作の情報を保存できます。別のクエリでテーブルを手書きで (さまざまに) 書き出すのではありません。

明示的な JOIN クエリについても学び、それらを使用する必要があります。

于 2012-11-30T07:22:24.693 に答える