こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

sql2005 UPDATEの質問なのですが、先日jamshid6さん

sql2005 UPDATEの質問なのですが、先日jamshid6さんに
顧客毎の累計金額を顧客マスタへupdateの方法を教えて
もらったのですが、期間の日付がnullの場合が発生すること
があり、nullの場合は、全データ対象となる書き方を教えて
下さい。

(1)
update 顧客マスタ
set 累計金額=B.累計金額
from 顧客マスタ as A
inner join
(select 顧客コード,sum(売上金額) as 累計金額
from 売上データ
where 売上日付 between '2010/03/01' and '2010/06/30'
group by 顧客コード) as B on A.顧客コード=B.顧客コード

(2)
あと、顧客マスタには、生年月日があり、本日日付より年齢を求めて
顧客マスタの年齢にupdateすることは可能ですか?
これも、生年月日がnullの時もあるので、その場合は、年齢を0にした
いと思います。
顧客マスタ...顧客コード、生年月日(datetime)、年齢(int)

宜しくお願いします。

投稿日時 - 2010-05-31 10:07:40

QNo.5934306

困ってます

質問者が選んだベストアンサー

(1)
期間の日付って「売上日付」ですか?
これがNULLになるのは構造上変じゃないかと思いつつ、「売上日付がNULLなら期間指定が何であれ常に集計対象にしてよい」ということでいいですか?
それでいいなら、
WHERE 売上日付 between '2010/03/01' and '2010/06/30' OR 売上日付 IS NULL
にしてみてください。

(2)
通常生年月日に時刻までは記録されないので、シンプルに以下の通りでいいでしょう。
UPDATE 顧客マスタ
SET 年齢=ISNULL(DATEDIFF(yy,生年月日,GETDATE())+
CASE WHEN DATEADD(yy,DATEDIFF(yy,生年月日,GETDATE()),生年月日)>GETDATE() THEN -1 ELSE 0 END,0)

投稿日時 - 2010-05-31 10:45:18

補足

sql2005 UPDATE
jamshid6さん

(1)
期間の日付って「売上日付」ですか?
これがNULLになるのは構造上変じゃないかと思いつつ、「売上日付がNULLなら期間指定が何であれ常に集計対象にしてよい」ということでいいですか?
それでいいなら、
WHERE 売上日付 between '2010/03/01' and '2010/06/30' OR 売上日付 IS NULL
にしてみてください。

説明がわるくてすみません。データの売上日付にNULLが入る事はないのですが、
売上日付の抽出範囲を指定する時(3/1~6/30とか)と、範囲を指定せずに売上データ
全件と言う意味です。
売上日付の期間は、@開始日付 datetime,@終了日付 datetimeでストアドへ引数で渡して
いるのでが、UPDATEの前でIFで判断するのか?出来れば、UPDATE分の中に記述出来
ないものかと思います。

宜しくお願いします。

投稿日時 - 2010-05-31 12:05:39

このQ&Aは役に立ちましたか?

15人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

#1です。

条件内で記述したいなら、
WHERE 売上日付 BETWEEN ISNULL(@開始日付,'1900/01/01') AND ISNULL(@終了日付,'2099/12/31')
でどうですか

投稿日時 - 2010-05-31 12:42:33

お礼

何度もすみません。
有難うございます。

投稿日時 - 2010-05-31 13:12:40

あなたにオススメの質問