3

ID ごとに今月の最低残高を返す必要があるクエリがあります。私が得ている問題は、Balance の最小残高ではなく、複数の残高を返すことです。次のような結果が得られ続けます。

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
4

3 に答える 3

3

残高を含めないでくださいgroup by(最小値を実行しているため)。おそらくdatepart、選択で使用している を使用する必要があります (そうしないと、月ごとにグループ化されません)。とにかくwhere句でnull以外のleft joinレコードを探しているので、どちらも意味がありません。これはうまくいくかもしれません:

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

ご覧のとおり、distinctandキーワードも削除しました。は(コードのにおいがなければ)不要であることが多く、ビューのデバッグまたは注文のためだったと思いますが、これはおそらくすべきではありませんtopDistinctgroup bytop

于 2012-04-20T14:16:20.213 に答える
0
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
于 2012-04-20T14:33:38.420 に答える
0
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 が問題の一部です。見てください。

于 2012-04-20T14:16:18.693 に答える