2017-04-26 5 views
0

私はすべての不完全な日付の列を含むMySQLデータベースを持っています。データの性質上、月額のデータであるため、その月の日は割り当てられていません。 (実際のアプリケーションとは別の)具体的な例を持っているために、のは、それが毎月の売上のテーブルだとしましょう - monthly_salesそれを呼び出す - 別の店舗で、それぞれのタイプのvarchar(20)date、およびfloat、と列MySQLで不完全な日付の連続した月の行に結合する

store_name | month_date | sales 

で。 month_date列には2016-01-00などの不完全な日付しかありません。sales列には1か月全体をカバーするデータが含まれています。良くも悪くも - - 固定されているので、今、このデザインを変更するオプションはありません

create table monthly_sales (store_name varchar(20), month_date date, sales float); 

insert into monthly_sales values 
('New York', 20160100, 30000), 
('New York', 20160200, 6000), 
('Boston', 20160100, 8000), 
('Boston', 20160200, 3000); 

データベース設計は:

は、ここで説明したようにおもちゃのテーブルを作成するためのコードです。

質問は、同じ店舗の売上を連続した月間で比較するクエリを構造化しようとしています。 date_subの文書化動作が不完全な日付が与えられたとき、それはnullを返すということですので

select * from monthly_sales as ms1 
join monthly_sales as ms2 on ms1.store_name=ms2.store_name and ms2.month_date=date_sub(ms1.month_date, interval 1 month) 

これは動作しない:私はこのクエリを試してみました。所望の出力は

New York | 2016-02-00 | 6000 | New York | 2016-01-00 | 30000 
Boston | 2016-02-00 | 3000 | Boston | 2016-01-00 | 8000 

(これは類似しています。私は数ヶ月で算術演算をやっているのに対し、唯一の日が定義されていないので、この場合には、操作が概念的に明確に定義されている、というFWIWに注意されているだろうその日の時刻に関係なく、2つの日付間の日数の差をとってください)。

私は尋ねる前に検索しましたが、関連するが異なる質問がありました。私は、私の中には重複していることを避けるために詳細が十分に異なると思います。私がチェックした質問のうち:

  • Operations on incomplete dates in MYSQLこの質問は古いバージョンのMySQLを参照しています。また、日付の違いを得るために固定されていますが、実際に決して日付の差異を計算していない場合でも、正しい論理結合を作成するソリューションはすべて公開されています。
  • MySQL: Count of records with consecutive monthsこれは連続した月を扱いますが、完全な日付です。 (回答では、実際のアプリケーションを強制終了するサブクエリのネストされたシーケンスも使用されます)

ここではどのような回避方法がありますか?私はそれ自身のために日付計算を気にせず、述べられた目標を達成するために結合を形成する別の方法に開放しています。それは販売の値が「フロート」になると幻想そうだと

+0

2番目のリンクされた質問はあなたの質問に答えることはできませんが、質問する方法を示しています。 – Strawberry

+0

@Strawberryここで何が役に立つのか分かりません。小さなテーブルを作成するコードを追加しました。そうでなければ、あなたのコメントは参考になるほどあまりにも謎めいていました。何が必要なのか分かっている限り、必要に応じて更新したいと思っています。 – Brick

答えて

0

デザインが修正されるかもしれないが、おそらくデータがない...

create table monthly_sales (store_name varchar(20), month_date date, sales float); 

insert into monthly_sales values 
('New York', 20160101, 30000), 
('New York', 20160201, 6000), 
('Boston', 20160101, 8000), 
('Boston', 20160201, 3000); 

select * from monthly_sales as ms1 
join monthly_sales as ms2 on ms1.store_name=ms2.store_name and ms2.month_date=date_sub(ms1.month_date, interval 1 month) 

注意。 DECIMALが発明された理由です。

+0

実際のアプリケーションでは、それは "売り上げ"ではないので、あまりにも多くのことが浮動していると心配しないでください。実際のシステムにはあまりにも多くのデータが存在するため、手動で新しいテーブルを作成することは問題になりません。古いテーブルから新しいテーブルをコードで作成することは考えられますが、大きなテーブルではコストがかかると思います。私はそれを考慮するでしょう。ありがとう。 – Brick

+0

私は新しいテーブルの作成を提案していません。既存のものを編集するだけです! – Strawberry

+0

既存のテーブルを編集することはできません。私には外的制約があります。それが私のコメントによって "デザイン"が修正されたことを伝えようとしていたものです。私はスキーマを意味するものではありません。 – Brick

関連する問題