SQL فك التشفير على العمود 4 ولكن فقط عندما يكون العمود 5 متميز

StackOverflow https://stackoverflow.com/questions/979868

سؤال

أحتاج إلى تغيير تعبيرات المجموع (فك شفرة ()) التي تشبه

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

إلى شيء يعتمد الصفوف مع VCon.Wagon-Type-Code = '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

يحتاج التعبير إلى إرجاع الرقم 3 بدلا من 4 كمبلغ (فك التشفير (VCON.WACON_TYPE_CODE، "السيدة"، 1،0)) حاليا.

أي اقتراحات؟

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"
هل كانت مفيدة؟

المحلول

أعتقد أن ما يلي يجب أن يعمل (هذا العد متميز 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

هتافات،

--
فينسنت

نصائح أخرى

يمكنك استخدام Sacquery الذي يقوم بمرشحات تكرار العلامات. الاستعلام الخاص بك معقد جدا، ولكن هذا ستحسب فقط المبلغ الذي تبحث عنه:

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

التأكد من أن هناك صف واحد فقط لكل (Wagon_Type، ACI_TAG_NO).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top