質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

4738閲覧

SQLServerで、うるう年を結合して前年比較をする

tomato-salada

総合スコア68

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2017/05/23 00:46

SQLserver2008R2使用しています。

お店の日別予算・当日売上・前年売上を表示させようとしています。

●現状
日付 店舗 予算 実績 前年
20170201 A 110000 100000 90000
20170202 A 100000 70000 60000
20170203 A 100000 120000 150000
/
/
20170228 A 120000 120000 150000

●希望
日付 店舗 予算 実績 前年
20170201 A 110000 100000 90000
20170202 A 100000 70000 60000
20170203 A 100000 120000 150000
/
/
20170228 A 120000 120000 150000
20170228 A 0 0 120000

select * from yosan full outer join uriage on yosan.店舗CD = uriage.店舗CD and yosan.日付 = uriage.日付 where isnull(yosan.店舗CD,uriage.店舗CD) = A and isnull(yosan.日付,uriage.日付) between 20170201 and 20170231

●TABLE
yosan
-日付 char(8)
-店舗CD int
-予算 int

uriage
-日付 char(8)
-店舗CD int
-売上 int

どちらのテーブルも、日付計算することがあるので、20170229等、エラーが発生する値は入れておりません。

通常のクエリのみでは、難しいと感じていますが、こういう場合どのように対応するのがよいでしょうか?
テーブル設計等のヒントも併せてご指導お願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

workaholist

2017/05/23 09:33

提示にSQLを実行しても「現状」のようなレコードが取得できるとは思えないのですが。どういうレコードに対してどういうSQLを実行したらどういう結果が取得できればよいのか整理していただければ回答しやすいです。
guest

回答1

0

ベストアンサー

日付は特別な事情が無い限り date型 にしてください。
特別な事情とは'2017-02-31'などあり得ない日付を扱わなければならない等、極めて特殊な場合です。

-- 以下追記 --
私だったらこんなクエリを書きます。

SQL

1SELECT t1.日付, t1.店舗, [予算 実績 前年 はサブクエリで] 2FROM 3( 4 SELECT 日付, 店舗 FROM uriage WHERE 日付 >= '2017-02-01' AND 日付 < DATEADD (month, 1, '2017-02-01') 5 UNION 6 SELECT 日付, 店舗 FROM yosan WHERE 日付 >= '2017-02-01' AND 日付 < DATEADD (month, 1, '2017-02-01') 7) AS t1

投稿2017/05/23 01:26

編集2017/05/23 09:50
hihijiji

総合スコア4150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hihijiji

2017/05/23 02:12

データ構造さえ出来ていれば、3月1日の前日は必ず2月ですので悩む必要がありません。 また日付関数も利用できるので計算も楽です。
hihijiji

2017/05/23 02:24

抜けてましたが、最大のメリットは日付が入ることが保証される事でしょうね。 これが無いと毎回検証が必要になりまともに扱えません。
tomato-salada

2017/05/23 09:00

回答ありがとうございます。 もともとの製品のテーブル仕様がdateではなくて、CHAR(8)だったので、それに併せざるをえないのです。 仮にdateだった場合、どのように前年と結合させるのでしょうか?
hihijiji

2017/05/23 12:49

FROM句で null かもしれないものを拾うと全ての句が影響を受けます。 クエリ処理の順番を意識して、極力シンプルになるようにしましょう。
tomato-salada

2017/05/23 22:35

ありがとうございました。 最初のクエリもおかしかったです。申し訳ありません。 回答参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問