
テーブルAには、年月、単価と言うカラムを持っており、
データとしては、下記のように保持しております。
2011/01/01 100
2011/02/01 200
2011/03/01 300
2011/04/01 400
データを取得する際にWHERE句に「2011/02/01」と指定した場合に
「2011/02/01」を当月とし、
「2011/01/01」を前月として取得、
「2011/02/01」の単価と「2011/01/01」の単価を差分として取得したいのですが、
サブクエリだと複数のデータがあるため、エラーで落ちてしまいます。
何か良い取得方法があればご教授頂けないでしょうか。
SELECT
単価 as 当月, (例:200)
単価 as 前月, (例:100)
単価 as 差分 (例:100)
FROM テーブルA WHERE 年月='2011/02/01'
以上、よろしくお願い致します。
No.3ベストアンサー
- 回答日時:
あまり難しいことはせず、SQL文は単純なものが望ましいです。
ちなみに以下のSQL文はデータが存在しない月は0(ゼロ)として
取り扱っていますので必要に応じて修正して下さい。
SELECT
[当月],
[前月],
([当月] - [前月]) AS [差分]
FROM
(
SELECT
ISNULL([当月],0) AS [当月],
ISNULL([前月],0) AS [前月]
FROM
(
SELECT
SUM([当月]) AS [当月],
SUM([前月]) AS [前月]
FROM
(
SELECT [単価] AS [当月], 0 AS [前月] FROM [テーブルA] WHERE [年月] = '2011/02/01'
UNION ALL
SELECT 0 AS [当月], [単価] AS [前月] FROM [テーブルA] WHERE [年月] = DATEADD(month ,-1 , CAST('2011/02/01' AS datetime))
) AS T0
) AS T1
) AS T2
No.2
- 回答日時:
Select CONVERT(VARCHAR,A.[前月年月],112) AS 前月年月日
,A.前月単価
,CONVERT(VARCHAR,B.[当月年月],112) AS 当月年月日
,B.当月単価
FROM
(SELECT [年月] as 前月年月
,[単価] as 前月単価
FROM [テーブルA]
WHERE CAST(SUBSTRING(CONVERT(VARCHAR,[年月],112),1,6) as BIGINT)=
CAST(SUBSTRING(CONVERT(VARCHAR,DATEADD(month ,-1 , CAST('2011/02/01' as Datetime)),112),1,6) as BIGINT)) AS A,
(SELECT [年月] as 当月年月
,[単価] as 当月単価
FROM [テーブルA]
WHERE CAST(SUBSTRING(CONVERT(VARCHAR,[年月],112),1,6) as BIGINT)=
CAST(SUBSTRING(CONVERT(VARCHAR,CAST('2011/02/01' as Datetime),112),1,6) as BIGINT)) AS B
の記述で可能かと思います。
ちなみに
1.CONVERT(VARCHAR,[年月],112)で
日付型(例:2011/02/01)を文字列型(例:20110201)に変換しています。
2.変換した文字列から必要なのは年月のみなので「SUBSTRING」で1桁目から
6桁目までの値を取得しています。
SUBSTRING('20110201',1,6)⇒'201102'
3.年月を取得した所でその値を正確に大小比較するために数値に変換しています。
CAST('201102' as bigint)⇒201102
4.次に指定する日付に関しては'2011/02/01'はただの文字列として処理されるので(SQL 2005)
'2011/02/01'を日付型に変換するためにCAST('2011/02/01' as Datetime)と
記載しています。
5.次に指定した日付のひと月前の日付処理はDATEADDという関数を使用します。
DATEADD(month ,-1 , CAST('2011/02/01' as Datetime)),112)
以上の点を考慮しつつ、クエリを作成すれば、指定された年月とひと月前のデータが出力されます。
ご回答ありがとうございます。
教えて頂いたSQLを理解するに少しお時間を下さい。。
頂いた回答を元にSQLを考察し、解決次第ご連絡させて頂きます。
No.1
- 回答日時:
質問文から素直に考えると年月がキーだから
select t1.単価 as 当月,t2.単価 as 前月,t1.単価 - t2.単価 as 差分
from
(SELECT 単価 FROM テーブルA WHERE 年月='2011/02/01') t1,
(SELECT 単価 FROM テーブルA WHERE 年月='2011/01/01') t2
注:'2011/01/01'は'2011/02/01'の1ヶ月前を関数でもとめるといいですが。
(SQL Serverの日付計算の関数を度忘れしてます。)
・・・年月が日付型かどうかによっても使う関数は変わりますが。
でも
select t1.単価 as 当月,
(SELECT 単価 FROM テーブルA WHERE 年月='2011/01/01') as 前月,
t1.単価 - (SELECT 単価 FROM テーブルA WHERE 年月='2011/01/01') as 差分
from テーブルA t1 WHERE 年月='2011/02/01'
でも問題なく、t1もt2も1件ずつしか取得しないように思えるのですが。
実際は、キー項目に商品コードがあって、直積になってしまうというのなら、
select t1.商品コード,t1.単価 as 当月,t2.単価 as 前月,t1.単価 - t2.単価 as 差分
from
(SELECT 商品コード,単価 FROM テーブルA WHERE 年月='2011/02/01') t1,
(SELECT 商品コード,単価 FROM テーブルA WHERE 年月='2011/01/01') t2
where t1.商品コード = t2.商品コード
または、
select t1.単価 as 当月,
(SELECT t2.単価 FROM テーブルA t2 WHERE t2.年月='2011/01/01' and t1.商品コード = t2.商品コード) as 前月,
t1.単価 - (SELECT t2.単価 FROM テーブルA t2 WHERE t2.年月='2011/01/01' and t1.商品コード = t2.商品コード) as 差分
from テーブルA t1 WHERE t1.年月='2011/02/01'
とすればよいだけですし。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(資産運用・投資) 投資信託の積立投資の取得単価 3 2022/08/31 16:48
- 簿記検定・漢字検定・秘書検定 満期保有目的債券の償却原価法の計算について(簿記2級) 1 2022/06/18 15:40
- MySQL 複数DBテーブルからのデータ取得 3 2022/05/17 15:02
- その他(資産運用・投資) 株式の平均取得単価について 4 2022/11/17 01:36
- 株式市場・株価 同日中の特定口座内での株式売買における実質損益について 4 2022/06/22 05:18
- PostgreSQL 列が存在しないと言われる 2 2023/02/10 18:33
- Excel(エクセル) 単価シートから単価をエクセル関数で自動取得する方法 1 2023/07/02 22:00
- 債券・証券 先月から積み立てニーサを始めましたが、数量やら単価やら取得価格やらの意味がいまいちよく理解できません 1 2022/12/17 10:50
- 不動産投資・投資信託 投資信託で取得単価が下がるのはなぜ? 1 2022/11/30 14:16
- MySQL SQLです。下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 「昨年の各月の総降 1 2023/07/01 00:32
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXISTSを使ったDELETE文
-
SQL文で、合計が0のレコードを...
-
フィールドの数値を四捨五入の...
-
アクセス フィールド名に変数...
-
アクセス★非課税、課税の合計金...
-
Accessの実行時エラーについて
-
レコードが少ないマスタの結合
-
無駄に見える結合の回数を減ら...
-
ACCESS ツリービューの作り方
-
フィルターかけた後、重複を除...
-
エクセルで最後の文字だけ置き...
-
外部参照してるキーを主キーに...
-
SQLで特定の項目の重複のみを排...
-
SELECT 文 GROUP での1件目を...
-
差し込み後、元データを変更し...
-
エラー 1068 (42000): 複数の主...
-
Outlook 送受信エラー
-
INSERT文でフィールドの1つだ...
-
1、Rstudioで回帰直線を求める...
-
count集計の結果が0の場合でも...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXISTSを使ったDELETE文
-
SQL文で、合計が0のレコードを...
-
Accessの実行時エラーについて
-
ACCESS ツリービューの作り方
-
ACCESS 商品毎の最新の単価を設...
-
日付により変動する「単価」を...
-
アクセス フィールド名に変数...
-
ACCESSでDLookUpすると、不正な...
-
Excel VBA ADODB
-
ACCESSでクエリ作成時複数のフ...
-
異なるデータベース間のテーブ...
-
ACCESSのマスタの変更について
-
Access2013で商品に複数の単価...
-
前月の取得について
-
日付の範囲検索で
-
アクセス★非課税、課税の合計金...
-
SQL2005 クエリ文について
-
AS400にてサブファイルレコード...
-
自己結合について
-
ビューの更新タイミング
おすすめ情報