2009-06-11 4 views
0

別個のものである場合にのみ、私はvcon.WAGON-TYPE-CODE = 'を持つ行をカウント何かにSQLデコードしかしCOLUMN5が

SUM(Decode(vcon.WAGON_TYPE_CODE,'MS',1,0)) 

のようなものです(デコード())式の合計を変更する必要がありますMS 'であるが、wag.ACI-TAG-NOが異なる場合にのみ起こる。二つの列がこの

vcon.WAGON_TYPE_CODE wag.ACI_TAG_NO 
MS      HI1111 
SS      C99999 
MS      HI1111 
MS      HI7777 
SS      HI8888 
MS      HI6666 

のように見えるのであれば式はSUM(デコード(vcon.WAGON_TYPE_CODE、 'MS'、1,0))として数3ではなく4を返す必要

は現在ありません。

提案がありますか?

querySELECT = "SELECT " 
querySELECT = querySELECT & "trn.WID_DATE, " 
querySELECT = querySELECT & "trn.MINE_CODE, " 
querySELECT = querySELECT & "trn.TRAIN_CONTROL_ID, " 
querySELECT = querySELECT & "trn.NUM_CARS as HBD_Car_Count, " 
querySELECT = querySELECT & "SUM(Decode(vcon.WAGON_TYPE_CODE,'MS',1,0)) M_Series, " 
querySELECT = querySELECT & "(SUM(Decode(vcon.WAGON_TYPE_CODE,'SS',1,0))-SUM(Decode(wag.ACI_TAG_NO,'HI0000',1,0))) S_Series, " 
querySELECT = querySELECT & "SUM(Decode(vcon.WAGON_TYPE_CODE,'CS',1,0)) C_Series, " 
querySELECT = querySELECT & "SUM(Decode(wag.ACI_TAG_NO,'HI0000',1,0)) as No_Tag, " 
querySELECT = querySELECT & "(COUNT(1) - trn.NUM_CARS) DB_Mismatch " 

queryFROM = "FROM widsys.consist con, widsys.train trn, widsys.wagon wag, widsys.v_consist_ore_detail vcon " 

queryWHERE = "WHERE trn.TRAIN_RECORD_ID = con.TRAIN_RECORD_ID " 
queryWHERE = queryWHERE & "AND con.WAGON_ID = wag.WAGON_ID " 
queryWHERE = queryWHERE & "AND ((vcon.CONSIST_ID=con.CONSIST_ID) " 
queryWHERE = queryWHERE & "AND trn.MINE_CODE In (" & mine & ") " 
queryWHERE = queryWHERE & "AND (trn.DIRECTION='N') " 
queryWHERE = queryWHERE & "AND (wag.ACI_TAG_TYPE In ('CONTROL','SLAVE','ORE')) " 
queryWHERE = queryWHERE & "AND (trn.WID_DATE>={ts '" & startDate & "'} " 
queryWHERE = queryWHERE & "AND trn.WID_DATE<={ts '" & endDate & "'})) " 

queryGROUPBY = "GROUP BY trn.WID_DATE, trn.MINE_CODE, trn.TRAIN_CONTROL_ID, trn.NUM_CARS " 
queryORDERBY = "ORDER BY trn.WID_DATE DESC" 

答えて

2

私は(これは明確なwag.ACI_TAG_NOのみvcon.WAGON_TYPE_CODE='MS'をカウント)以下は動作するはずだと思う:

COUNT(DISTINCT Decode(vcon.WAGON_TYPE_CODE,'MS',wag.ACI_TAG_NO,NULL)) 

例:

SQL> WITH data AS (
    2  SELECT 'MS' WAGON_TYPE_CODE, 'HI1111' ACI_TAG_NO FROM DUAL UNION ALL 
    3  SELECT 'SS', 'C99999' FROM DUAL UNION ALL 
    4  SELECT 'MS', 'HI1111' FROM DUAL UNION ALL 
    5  SELECT 'MS', 'HI7777' FROM DUAL UNION ALL 
    6  SELECT 'SS', 'HI8888' FROM DUAL UNION ALL 
    7  SELECT 'MS', 'HI6666' FROM DUAL 
    8 ) 
    9 SELECT COUNT(DISTINCT decode(WAGON_TYPE_CODE,'MS',ACI_TAG_NO,NULL)) 
10 FROM DATA 
11 ; 

COUNT(DISTINCTDECODE(WAGON_TYP 
------------------------------ 
          3 

乾杯、

から
ヴィンセント

+0

+1私はSUM(DECODE(x、y、1,0))の構造が好きなので、ここで正しいアプローチをしています。 – spencer7593

0

重複するタグをフィルタするサブクエリを使用できます。あなたのクエリはかなり複雑ですが、これはあなたが探しているだけの合計を計算します:

SELECT SUM(Decode(sub.WAGON_TYPE_CODE,'MS',1,0)) 
FROM (
    SELECT DISTINCT vcon.WAGON_TYPE_CODE, wag.ACI_TAG_NO 
    FROM widsys.wagon wag 
    INNER JOIN widsys.consist con 
     ON con.wagon_id = wag.wagon_id 
    INNER JOIN widsys.v_consist_ore_detail vcon 
     ON vcon.CONSIST_ID = con.CONSIST_ID 
) sub 

DISTINCTは(wagon_type、aci_tag_no)の組み合わせごとに1つだけの行があることを確認します。

関連する問題