2012-04-20 10 views
3

私は各IDの今月の最低残高を返す必要がある質問があります。私が得ている問題は、バランスの最小残高の代わりに複数の残高を返すことです。私はそれだけで最低のバランス返却する必要がある場合私はちょうどMinを必要とします

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 

答えて

3

あなた(あなたがそれに分を実行しているので)、そしてあなたはおそらく、あなたが選択する(そうでなければ、月ごとにグループ化していない)で使用しているdatepartを使用する必要がありますgroup byバランスを含めるべきではありません。とにかく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 

は、私はまた、distincttopキーワードを削除しました。 Distinctは、group by(コードの匂いでない場合)とはしばしば必要ではなく、topはデバッグやビューを注文するとしています(should probably not do)。

+0

ありがとうございます、これは完璧に動作しています! – specialed

+0

私たちが初めてそれを釘付けになって聞いてうれしい! –

+0

私はあなたに役立つもう少し情報を追加しました。 –

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は少なくとも問題の一部です。見てみましょう。

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 
関連する問題