sql查询以获取不同人的最早日期

时间:2017-10-23 10:51:51

标签: sql sql-server

我正在尝试从表中选择用户可以在3个位置的最早日期。

SELECT RecordID,  
    (
        SELECT MIN(dDate) 
        FROM (
            VALUES(DateSent), 
            (DiaryDate),                 
            (CareDate)
        ) As EarliestDate(dDate)
    ) AS dDate 
FROM tblOrderDetails 
WHERE Flagged = 0 
AND SalesID= '" & UserID & "'
OR Flagged = 0 
And RepID= '" & UserID & "' 
OR Flagged = 0 
AND CareID= '" & UserID & "'"

3 个答案:

答案 0 :(得分:2)

如果您想要最早的日期,则需要import re list=["height = 7.2", "length = 8.32"] for dim in list: print(float(re.search('\d+.\d+', dim).group())) 。以下内容适用于某些数据库:

MIN()

(假设这是你想要的逻辑,你的查询中不需要括号。)

SELECT od.RecordID, (SELECT MIN(EarliestDate.dDate) FROM (VALUES (od.DateSent), (od.DiaryDate), (od.CareDate) ) As EarliestDate(dDate) ) as dDate FROM tblOrderDetails od WHERE (od.Flagged = 0 AND od.SalesID = '" & UserID & "') OR (od.Flagged = 0 AND od.RepID= '" & UserID & "') OR (od.Flagged = 0 AND od.CareID= '" & UserID & "'"); 子句可以简化为:

WHERE

请注意,WHERE od.Flagged = 0 AND ? IN (od.SalesId, od.RepId, od.CareId) 是参数的占位符。您应该将值作为参数传递,而不是更改查询字符串。

编辑:

这通常是使用?编写的,正如Noxtrhon所建议的那样。最简单的版本 - 假设没有CASE值 - 将是:

NULL

如果我没记错的话,SELECT od.RecordID, (CASE WHEN od.DateSent <= od.DiaryDate and od.DateSent <= od.CareDate THEN ad.DateSent WHEN od.DiaryDate <= od.CareDate THEN od.DiaryDate ELSE od.CareDate END) as dDate FROM tblOrderDetails od WHERE (od.Flagged = 0 AND od.SalesID = '" & UserID & "') OR (od.Flagged = 0 AND od.RepID= '" & UserID & "') OR (od.Flagged = 0 AND od.CareID= '" & UserID & "'"); 应该会有稍微好一点的表现,但是比我预期的要好得多。

答案 1 :(得分:1)

我想我明白你在做什么。如果我理解正确,您需要给定RecordID的这三列的最小日期。您可以通过对每列执行UNION ALL每个RecordID来实现。这可以获得MIN(日期)。 AS Justinas指出,你的WHERE中存在问题,必须小心混合AND和OR。

SELECT dT.RecordID, MIN(dT.inDate) AS [EarliestDate]
  FROM (
          SELECT RecordID, DateSent AS [inDate]
            FROM tblOrderDetails
           WHERE Flagged = 0 
             AND (   SalesID= '" & UserID & "'
                  OR   RepID= '" & UserID & "' 
                  OR  CareID= '" & UserID & "'
                 )

          UNION ALL

          SELECT RecordID, DiaryDate AS [inDate]
            FROM tblOrderDetails
           WHERE Flagged = 0 
             AND (   SalesID= '" & UserID & "'
                  OR   RepID= '" & UserID & "' 
                  OR  CareID= '" & UserID & "'
                 )

          UNION ALL

          SELECT RecordID, CareDate AS [inDate]
            FROM tblOrderDetails
           WHERE Flagged = 0 
             AND (   SalesID= '" & UserID & "'
                  OR   RepID= '" & UserID & "' 
                  OR  CareID= '" & UserID & "'
                 )
       ) AS dT
GROUP BY RecordID

答案 2 :(得分:0)

您可以使用案例陈述来检查案例并决定选择哪一个案例。您已询问最早的日期,但在查询中选择最新日期为Max(...),此查询将返回最早的日期:

SELECT RecordID, 
 case when DateSent < DiaryDate and DateSent < CareDate then DateSend
      when DiaryDate < DateSent and DiaryDate < CareDate then DiaryDate
      else CareDate end as dDate
FROM tblOrderDetails
WHERE Flagged = 0 AND
      SalesID = '" & UserID & "'OR Flagged = 0 And
      RepID = '" & UserID & "' OR Flagged = 0 AND CareID= '" & UserID & "'"