2015-05-08 78 views
0

我是SQL非常新,我一直在處理我的第一個查詢。現在我需要你的幫助。 我在Excel中有這個報告。我在計算AGE的AGE列中有公式。我一直在試圖創建一個SQL查詢來提出相同的答案。到目前爲止,我已經找出了需要的列,並將所有數據都拉到匹配Excel。唯一的問題是我不知道如何以及在哪裏輸入這個IF語句,因此它會計算我運行查詢時的年齡。如果在SQL中的語句來計算年齡

Work Order Location MISC Status Actual Finish Finish Time Parent WO Work Type N Reported Date Reported Time Site Gen Age Sub Name Substation Location       
1234567899 4074  COMP 11/5/14 3:08:49 PM  CM  10/7/14 1:47:42 PM   29.05633102         
12348574987 2946  SCHED    CM  10/30/14 10:28:03 AM   188.5638542  

年齡的公式,粘貼如下:

=IF ((IF(Status<>"Comp",Today()-Reported date, actual finish-reported date))<0,0, IF(STATUS<>"COMP", TODAY()-REPORTED DATE, ACTUAL FINISH-REPORTED DATE))  

SQL Writen查詢

SELECT WO.WONUM,                       
    LOCOFFDESC.DESCRIPTION AS OFFICE,                      
    WO.STATUS,                       
    WO.LOCATION,                      
    CASE                      
    WHEN ((INSTR(LOCOFF.EXT_LOC_HIERARCHY_PATH, '/', 2, 3)) = 0)                       
    THEN SUBSTR(LOCOFF.EXT_LOC_HIERARCHY_PATH, ((INSTR(LOCOFF.EXT_LOC_HIERARCHY_PATH, '/', 1, 2) + 2)), LENGTH(LOCOFF.EXT_LOC_HIERARCHY_PATH))                      
    WHEN ((INSTR(LOCOFF.EXT_LOC_HIERARCHY_PATH, '/', 2, 3)) IS NOT NULL)                       
    THEN SUBSTR(LOCOFF.EXT_LOC_HIERARCHY_PATH, ((INSTR(LOCOFF.EXT_LOC_HIERARCHY_PATH, '/', 1, 2) + 2)), (INSTR(LOCOFF.EXT_LOC_HIERARCHY_PATH, '/', 2, 3)) - (INSTR(LOCOFF.EXT_LOC_HIERARCHY_PATH, '/', 1, 2) + 2))                      
    END AS "SUBSTATION CASE",                      
    WO.PARENT,                       
    WO.WORKTYPE,                      
    WO.REPORTEDBY,                       
    WO.REPORTDATE,                       
    WO.ACTFINISH,                      
    WO.SITEID                      
FROM LOCATIONS LOCOFF                      
RIGHT JOIN MAXPRD.WORKORDER WO                      
ON WO.LOCATION = LOCOFF.LOCATION                       
INNER JOIN MAXPRD.LOCANCESTOR LOCOFFANC                      
ON LOCOFFANC.LOCATION = LOCOFF.LOCATION                      
INNER JOIN MAXPRD.LOCATIONS LOCOFFDESC                      
ON LOCOFFANC.ANCESTOR = LOCOFFDESC.LOCATION                      
INNER JOIN MAXPRD.LOCHIERARCHY LOCOFFHIER                      
ON LOCOFFANC.ANCESTOR = LOCOFFHIER.LOCATION                      
WHERE LOCOFF.SITEID = 'SUB'                      
AND LOCOFFHIER.PARENT = '2000'                      
GROUP BY WO.WONUM,                      
    LOCOFFDESC.DESCRIPTION,                      
    WO.STATUS,                       
    WO.LOCATION,                      
    LOCOFF.EXT_LOC_HIERARCHY_PATH,                       
    LOCOFF.SITEID,                       
    LOCOFFHIER.PARENT,                       
    WO.PARENT,                       
    WO.WORKTYPE,                      
    WO.REPORTEDBY,                       
    WO.REPORTDATE,                       
    WO.ACTFINISH,                      
    WO.SITEID 
+1

這是用於Microsoft SQL Server或MySQL?他們不是一回事。請刪除不適用的標籤。 –

回答

1

您將計算SELECT語句之後,之前的FROM語句,讓你擁有列中填充了計算值,類似於excel。

我們需要知道您正在使用哪種數據庫系統來獲取確切的語法。你可以嘗試一下WO.SITEID,

SELECT WO.WONUM, 
    LOCOFFDESC.DESCRIPTION AS OFFICE, 
    WO.STATUS, 
    WO.LOCATION, 
    CASE 
    WHEN ((INSTR(LOCOFF.EXT_LOC_HIERARCHY_PATH, '/', 2, 3)) = 0) 
    THEN SUBSTR(LOCOFF.EXT_LOC_HIERARCHY_PATH, ((INSTR(LOCOFF.EXT_LOC_HIERARCHY_PATH, '/', 1, 2) + 2)), LENGTH(LOCOFF.EXT_LOC_HIERARCHY_PATH)) 
    WHEN ((INSTR(LOCOFF.EXT_LOC_HIERARCHY_PATH, '/', 2, 3)) IS NOT NULL) 
    THEN SUBSTR(LOCOFF.EXT_LOC_HIERARCHY_PATH, ((INSTR(LOCOFF.EXT_LOC_HIERARCHY_PATH, '/', 1, 2) + 2)), (INSTR(LOCOFF.EXT_LOC_HIERARCHY_PATH, '/', 2, 3)) - (INSTR(LOCOFF.EXT_LOC_HIERARCHY_PATH, '/', 1, 2) + 2)) 
    END AS "SUBSTATION CASE", 
    WO.PARENT, 
    WO.WORKTYPE, 
    WO.REPORTEDBY, 
    WO.REPORTDATE, 
    WO.ACTFINISH, 
    WO.SITEID, 
(
CASE 
    WHEN (
     CASE WHEN WO.STATUS != 'Comp' 
      THEN SYSDATE-WO.REPORTDATE 
      ELSE WO.ACTFINISH-WO.REPORTDATE 
     END) < 0 
     THEN 0 
     ELSE 
      CASE WHEN STATUS != 'COMP' 
       THEN SYSDATE-WO.REPORTDATE 
       ELSE WO.ACTFINISH-WO.REPORTDATE 
      END 
END) as age 
FROM LOCATIONS LOCOFF 
RIGHT JOIN MAXPRD.WORKORDER WO 
ON WO.LOCATION = LOCOFF.LOCATION 
INNER JOIN MAXPRD.LOCANCESTOR LOCOFFANC 
ON LOCOFFANC.LOCATION = LOCOFF.LOCATION 
INNER JOIN MAXPRD.LOCATIONS LOCOFFDESC 
ON LOCOFFANC.ANCESTOR = LOCOFFDESC.LOCATION 
INNER JOIN MAXPRD.LOCHIERARCHY LOCOFFHIER 
ON LOCOFFANC.ANCESTOR = LOCOFFHIER.LOCATION 
WHERE LOCOFF.SITEID = 'SUB' 
AND LOCOFFHIER.PARENT = '2000' 
GROUP BY WO.WONUM, 
    LOCOFFDESC.DESCRIPTION, 
    WO.STATUS, 
    WO.LOCATION, 
    LOCOFF.EXT_LOC_HIERARCHY_PATH, 
    LOCOFF.SITEID, 
    LOCOFFHIER.PARENT, 
    WO.PARENT, 
    WO.WORKTYPE, 
    WO.REPORTEDBY, 
    WO.REPORTDATE, 
    WO.ACTFINISH, 
    WO.SITEID 

爲MS SQL服務器編輯。編輯再次爲Oracle :)

+0

您不能在查詢中使用IF語句。如果用於控制流,爲了有條件地處理輸出,您將使用一個case表達式。 –

+0

很高興你添加了你的輸入並投了我票,但你可以在查詢中使用IF,就像這樣:https://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_if – beiller

+0

不在sql服務器中,你不能。這也是用mysql標記的,也許你可以在mysql中做到這一點。 –