简体   繁体   English

SQL中的if语句来计算年龄

[英]if statement in SQL to calculate age

I am very new at SQL and I have been working on my First Query. 我是SQL的新手,我一直在研究First Query。 Now I need your help. 现在,我需要您的帮助。 I have this report in Excel. 我在Excel中有此报告。 I have formula in the AGE column N calculating the AGE. 我在AGE列N中有计算年龄的公式。 I have been trying to create a SQL query to come up with the same answer. 我一直在尝试创建一个SQL查询以得出相同的答案。 So far I have figured out the columns that I need and pulled all the data to Match Excel. 到目前为止,我已经找到了所需的列,并提取了所有数据以匹配Excel。 Only thing is I don't know how and where to enter this IF statement so it will calculate the age when i run the query. 唯一的事情是我不知道如何以及在哪里输入此IF语句,因此它将在我运行查询时计算年龄。

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     

AGE is a formula, pasted below: AGE是一个公式,粘贴在下面:

=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 Query SQL写查询

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 

You place the calculation after the SELECT statement, before the FROM statement, so you have a column filled with calculated values, similar to excel. 您将计算放在SELECT语句之后,在FROM语句之前,这样一列就充满了计算值,类似于excel。

We need to know what database system you are working with to get the exact syntax. 我们需要知道您正在使用哪个数据库系统来获取确切的语法。 Can you try after WO.SITEID, 您可以尝试使用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

Edited for MS SQL server. 为MS SQL Server编辑。 Edited AGAIN for Oracle :) 为Oracle编辑AGAIN :)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM