【问题标题】:if statement in SQL to calculate ageSQL中的if语句计算年龄
【发布时间】:2015-05-08 14:48:52
【问题描述】:

我是 SQL 的新手,我一直在处理我的第一个查询。现在我需要你的帮助。 我在 Excel 中有这份报告。我在 AGE 列 N 中有计算 AGE 的公式。我一直在尝试创建一个 SQL 查询来得出相同的答案。到目前为止,我已经找出了我需要的列并将所有数据提取到 Match Excel。唯一的问题是我不知道如何以及在何处输入此 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 是一个公式,粘贴在下面:

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

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 

【问题讨论】:

  • 这是用于 Microsoft SQL Server 还是 MySQL?他们不是一回事。请删除不适用的标签。

标签: excel oracle join


【解决方案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 编辑 :)

【讨论】:

  • 您不能在查询中使用 IF 语句。 If 用于控制流程,要有条件地处理输出,您将使用 case 表达式。
  • 很高兴您添加了您的输入并否决了我,但您可以在查询中使用 IF,就像这样:dev.mysql.com/doc/refman/5.0/en/…
  • 不能在 sql server 中。这也是用mysql标记的,也许你可以在mysql中做到这一点。
  • 可以的,我上面贴了mysql IF函数文档的链接。
  • 酷我不知道mysql,没有注意到标签,我不知道mysql。仍然不确定 OP 使用的是哪个 DBMS。 >.
猜你喜欢
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
相关资源
最近更新 更多