【问题标题】:I need just the Min我只需要Min
【发布时间】:2012-05-02 03:24:40
【问题描述】:

我有一个查询需要返回每个 ID 本月的最低余额。我遇到的问题是它返回多个余额而不是余额上的最小余额。 我不断得到这样的结果:

ID      Name   Month     Year  TodayMonth   TodayYear  BalMin 
1        A      4         12     4            2012      10,000.00 
1        A      4         12     4            2012      20,000.00

当我需要它返回最低余额时:

ID      Name   Month     Year  TodayMonth   TodayYear  BalMin 
1        A      4         12     4            2012      10,000.00

这是我目前所拥有的:

SELECT DISTINCT
     TOP (100) PERCENT History.ID, info.Name, DATEPART(mm, History.ReportDate) AS Month, DATEPART(yy,History.ReportDate) AS Year, DATEPART(mm, { fn CURDATE() }) AS TodayMonth, DATEPART(yy, { fn CURDATE() }) AS TodayYear, MIN(History.Balance) AS BalMin
    FROM         History LEFT OUTER JOIN Info ON History.ID = Info.ID
    WHERE     (DATEPART(yy, History.ReportDate) = DATEPART(yy, { fn CURDATE() })) AND (DATEPART(mm, History.ReportDate) = DATEPART(mm, 
                          { fn CURDATE() })) AND (History.Balance > 0)
    GROUP BY History.ID, History.ReportDate, Info.Name, History.Balance
    ORDER BY History.ID

【问题讨论】:

    标签: sql sql-server tsql min


    【解决方案1】:

    您的group by 不应该包括余额(因为您正在运行它的最小值),并且您可能应该使用您在选择中使用的datepart(否则您不会按月份分组)。 left join 也没有任何意义,因为无论如何您都在 where 子句中寻找非空记录。这可能有效:

    SELECT History.ID,
        Info.Name,
        DATEPART(mm, History.ReportDate) AS [Month],
        DATEPART(yy, History.ReportDate) AS [Year],
        MIN(History.Balance) AS BalMin
    FROM History
        JOIN Info ON History.ID = Info.ID
    WHERE (DATEPART(yy, History.ReportDate) = DATEPART(yy, { fn CURDATE() }))
        AND (DATEPART(mm, History.ReportDate) = DATEPART(mm, { fn CURDATE() }))
        AND (History.Balance > 0)
    GROUP BY History.ID,
        DATEPART(mm, History.ReportDate),
        DATEPART(yy, History.ReportDate),
        Info.Name
    ORDER BY History.ID
    

    如您所见,我还删除了 distincttop 关键字。 Distinct 通常与 group by 是不必要的(如果不是代码味道),我假设您的 top 用于调试或订购视图,您 should probably not do

    【讨论】:

    • 很高兴听到我们第一次成功!
    • 我添加了一些可能对您有帮助的信息。
    【解决方案2】:
    SELECT DISTINCT
         TOP (100) PERCENT History.ID, info.Name, DATEPART(mm, History.ReportDate) AS Month, DATEPART(yy,History.ReportDate) AS Year, DATEPART(mm, { fn CURDATE() }) AS TodayMonth, DATEPART(yy, { fn CURDATE() }) AS TodayYear, MIN(History.Balance) AS BalMin
        FROM         History LEFT OUTER JOIN Info ON History.ID = Info.ID
        WHERE     (DATEPART(yy, History.ReportDate) = DATEPART(yy, { fn CURDATE() })) AND (DATEPART(mm, History.ReportDate) = DATEPART(mm, 
                              { fn CURDATE() })) AND (History.Balance > 0)
        GROUP BY History.ID, DATEPART(mm, History.ReportDate), Info.Name
        ORDER BY History.ID
    

    我没有检查您查询的其余部分,但您的 GROUP BY 至少是问题的一部分。看看吧。

    【讨论】:

      【解决方案3】:
      SELECT  i.*, minbalance
      FROM    (
              SELECT  id, MIN(balance) AS minbalance
              FROM    history
              WHERE   reportDate >= DATEADD(day, -DAY(GETDATE()), CAST(GETDATE() AS DATE))
                      AND reportDate < DATEADD(month, 1, DATEADD(day, -DAY(GETDATE()), CAST(GETDATE() AS DATE)))
                      AND 
              GROUP BY
                      id
              ) b
      JOIN    info i
      ON      i.id = h.id
      

      【讨论】:

        猜你喜欢
        • 2023-02-21
        • 1970-01-01
        • 1970-01-01
        • 2018-02-02
        • 2017-07-06
        • 1970-01-01
        • 2023-03-17
        • 2013-10-13
        • 2012-09-16
        相关资源
        最近更新 更多