0

同じ列の 3 つの異なる数値を表示しようとしています mysql クエリで、1 か月を静的に保ちたい: 4 月なので、このような場合になります。表示したいのは、当月、前月、および静的です私が取り組んでいる年の月、この場合は 2012 に固執しましょう

Example
Tablename:payment

   id ,  pay_date,    amount
    1    2012-02-12    1000
    2    2012-03-11    780
    3    2012-04-15    890
    4    2012-05-12    1200
    5    2012-06-12    1890
    6    2012-07-12    1350
    7    2012-08-12    1450

したがって、私がやりたいことはamount、4 月の列を表示することです。その行を static: に保ちたいと890言ったので、現在の月は、現在の月が 8 月:1450であり、前月の金額が 7 月: であるとします1350。最終結果は次のようになります。

april_amount   current_month_amount  previous_month_amount
     890                 1450                 1350

しかし、私はここで立ち往生しています:

select amount as april_amount
from payment
where monthname(pay_date) LIKE 'April'
and year(pay_date) LIKE 2012

質問が十分に明確に書かれていることを願っています。助けてくれてありがとう。

4

2 に答える 2

1

結果が列ではなく行になる場合:

SELECT MONTHNAME(pay_date), amount FROM payment

WHERE  pay_date BETWEEN '2012-04-01'
                    AND '2012-04-30'

    OR pay_date BETWEEN CURRENT_DATE
                      - INTERVAL DAYOFMONTH(CURRENT_DATE) - 1 DAY
                    AND LAST_DAY(CURRENT_DATE)

    OR pay_date BETWEEN CURRENT_DATE
                      - INTERVAL DAYOFMONTH(CURRENT_DATE) - 1 DAY
                      - INTERVAL 1 MONTH
                    AND LAST_DAY(CURRENT_DATE - INTERVAL 1 MONTH)

sqlfiddleで参照してください。

于 2012-08-27T23:09:29.867 に答える
0

私はここから離れているかもしれません。しかし、試してください:

select top 1 
  p.amount, c.amount, n.amount 
from payment c
  inner join payment p ON p.pay_date < c.pay_date
  inner join payment n ON n.pay_date > c.pay_date
where monthname(c.paydate) LIKE 'April'
  and year(c.pay_date) LIKE 2012
order by p.pay_date DESC, n.pay_date ASC

編集、あなたの質問を正しく読みませんでした。私は前月、現在、そして来月に行きました。1 分後に再試行します。

select top 1 
  p.amount AS april_amount, c.amount AS current_month_amount, n.amount AS previous_month_amount
from payment c
  inner join payment p ON monthname(p.pay_date) = 'April' AND year(p.pay_date) = 2012
  inner join payment n ON n.pay_date > c.pay_date
where monthname(c.paydate) = monthname(curdate())
  and year(c.pay_date) = year(curdate())
order by n.pay_date ASC

これは、1 か月に 1 回のみのエントリがあることを前提としています。

わかりましたので、しばらく mysql で書いていません。サンプルデータで機能したのは次のとおりです。

select
  p.amount AS april_amount, c.amount AS current_month_amount, n.amount AS previous_month_amount
from payment AS c
  inner join payment AS p ON monthname(p.pay_date) LIKE 'April' AND year(p.pay_date) LIKE 2012
  inner join payment AS n ON n.pay_date < c.pay_date
where monthname(c.pay_date) LIKE monthname(curdate())
  and year(c.pay_date) LIKE year(curdate())
order by n.pay_date DESC
limit 1

結合された前月のテーブルは直感に反して名前が付けられnていますが、これは機能します。WAMPインストールで確認しました。

月ごとの集計を処理するには、副選択を使用できます。非常に大きなテーブル (数百万行以上) では、パフォーマンスが低下する場合があります。

SELECT SUM( a.amount ) AS april_amount, 
 (
  SELECT SUM( c.amount ) 
  FROM payment c
  WHERE MONTH( c.pay_date ) = MONTH( CURDATE( ) )
 ) AS current_month_amount, 
 (
  SELECT SUM( p.amount ) 
  FROM payment p
  WHERE MONTH( p.pay_date ) = MONTH( CURDATE( ) - INTERVAL 1 
  MONTH )
 ) AS previous_month_amount
FROM payment a
WHERE MONTHNAME( a.pay_date ) =  'April'
AND YEAR( a.pay_date ) =2012
于 2012-08-27T22:58:47.877 に答える