• 締切済み

MSDNselectしながらWHileでまわすには

お詳しい方、どうかたすけてください。 環境はMicrosoftSQLです。 やりたいことは、 あるテーブルからデータを取ってくる際に、最後の購入日を今の日付から1週間さかのぼりしながら、 何週間さかのぼったかを、useridと一緒に結果で返したいのです。 select userid , CASE WHEN MAX(購入日) > getdate()-7 THEN 1 WHEN MAX(購入日) > getdate()-14 THEN 2 as 'week' みたいなことなのですが、 これをWHILEを使って、永遠にさかのぼれるようにしたいのです。 例としては、 DECLARE @ss int; DECLARE @Recency int; set @ss = '7' set @Recency = '0' while (getdate()- @ss > '2012-10-01') begin set @ss = @ss- 7 set @Recency = @Recency + 1 SELECT user_id, case when max(購入日)> getdate()-@ss then @Recency as 'week' end from usrbuyingtable こんなかんじかとおもったのですが、 ぜんぜんうまくいきません・・ 文法チェックをお願いします。

みんなの回答

回答No.1

SELECT USERID,DATEDIFF(DAY,購入日,GETDATE())/7+1 FROM テーブル名 でどうでしょうか。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ストアドでのwhile文の利用法

    SQLServerでのストアドについてはこちらでうかがってもよろしいのでしょうか? ストアド内にてwhileでのループ文作成についてなんですが、 以下のようなストアドでSELECT内でA.NO1....とあるとおもうのですが、 これを@numRankの数だけ、A.NO(フィールド)を増やしたいのですが、 ここからどのようにつくればよろしいのでしょうか? CREATE PROCEDURE usp_Enquete @ask_idvarchar(10) AS DECLARE @strvarchar(1000) DECLARE @numRankint DECLARE @Counterint BEGIN SELECT @numRank = count(*) FROM B_Answer WHERE ask_id = @ask_id END SET NOCOUNT ON SET @Counter = 1 WHILE @Counter <= @numRank BEGIN SET @str = ' SELECT count(ansList.NO1) AS NumAns, A.NO1, A.NO2, A.NO3 FROM ・ ・ ・

  • ODBC SQLサーバーでSQLを使いたい・・・

    ODBC SQLサーバーでSQLを使いたい・・・ SET NOCOUNT ON DECLARE @EDATE DATETIME DECLARE @CUNT INT SET @COUNT = 0 WHILE ( @I <> -7 ) BEGIN IF ( DATANAME( WEEKDAY, DATEADD( DD, -1, GETDATE()))) = "金曜" BREAK ELSE SELECT @CUNT = @CUNT + 1 END SET @EDATE = CONVERT( CHAR, CONVERT( VARCHAR, DATEADD(DD, @COUNT, GETDATE()), 112) SELECT @EDATE 実行日からさかのぼり、金曜日の日付を表示したいSQLを作成しています。 なぜか"金曜"がおかしいとエラーが出てしまいます。 どなたかわかる方いましたらご教授お願い致します。

  • SQLでwhileやIFを使った場合の返り値について

     urizakaと申します。  さて、最近までSQLというのはselectやINSERTなどを使ってデータ ベースをいじるものだという認識しかなかったのですが、実は「IF」や「ELSE」 も組み込むことができると聞いて、さっそくプログラミングを組んでみました declare @i int declare @result int set @i = 0 while @i < 10 begin set @i = @i + 1 select @result=count(code_staff_client) from t_issue where code_staff_client=@i if @result != 0 BREAK end  これは、t_issue というテーブルを検索して、コード番号10までの 人間がいるかどうかを調べるためのSQL文なのですが、さて、この時に 条件に適合したら返り値として値1を返して処理を終わるというSQL文 にしたいのですが、この場合返り値についてどのように宣言すれば 良いのでしょうか?  このあとからわからなくなってしまったもので・・・すみませんが、ご存知 の方宜しくお願いします。

  • 変数の取り扱いについて

    はじめまして。思いっきりSQLSERVERは初心者なんですが宜しくお願いします。 現在SQLSERVER2005です。 ややこしくなるので要点だけ以下まとめています。 変数を利用してレコードを抽出する時なんですが… ALTER PROCEDURE Test @Rank INT BEGIN DECLARE @SELECT AS VARCHAR(100) DECLARE @WHERE AS VARCHAR(100) DECLARE @SQL AS VARCHAR(200) SET @SELECT = 'SELECT * FROM tblA ' SET @WHERE = 'WHERE Rank > ' + @Rank SET @SQL = @SELECT + @WHERE EXEC(@SQL) END 実行すると varchar の値 'WHERE Rank > 'をデータ型 int に変換できませんでした。 となります。 Rank部分が数値なんですが、どのように取扱いすべきなんでしょうか。

  • SQLでのCASEの使い方

    ASPからSQLを実行し、DBを操作するプログラムを組んでいます。 SQLをクエリアナライザで実行したときに→のところでエラーが出るのですが、どのようにしたらいいでしょうか? ----------------------------------------------- if object_id('xxxx') is not null  drop procedure xxxx go CREATE PROCEDURE xxxx (  @client_id char(10),  @user_id  char(10),   :(省略)  @code_1  char(6) output,  @code_2  char(6) output,   :(省略)  @code_9  char(6) output ) AS BEGIN  SET NOCOUNT ON  BEGIN TRANSACTION    DECLARE @no     int  SELECT @no = '0'  WHILE (@no <= 9)  BEGIN   SELECT @AAA = ISNULL(MAX job_code), '000000')    FROM TABLE    WHERE client_id = @client_id     And user_id = @user_id    SET @AAA = dbo.fbx_NextAlphanumeric(@AAA)   :(省略)   :   CASE @no →正しくない構文    WHEN 0 THEN SELECT @code_1 = @AAA    WHEN 1 THEN SELECT @code_2 = @AAA →正しくない構文     :(省略)    WHEN 9 THEN SELECT @code_9 = @AAA   END   SELECT @no = @no + 1  END  COMMIT TRANSACTION  RETURN 1 END go ----------------------------------------------- やりたいのは、SQL実行後にOUTPUTする変数「@code_1~9」にWHILEでループしながら求めた変数@AAAをセットしたいのですが。 初歩的なことだとは思いますが、よろしくお願いします。

  • ストアドプロシージャにてフェッチから出ない

    Aというテーブルの情報をカーソルにて取得し、 同じくAというテーブルに項目を変えてInsertするという プロシージャを作成しています。 しかし、フェッチしたあとその処理から出ません。 (ちなみにフェッチ後のBEGIN~END内のInsert文を違うテーブルにして実行してみると処理から抜けました) 下記が該当プロシージャです。 CREATE PROCEDURE 販売プロシージャ AS BEGIN --変数宣言 DECLARE @販売NO INT DECLARE @顧客NO INT DECLARE @明細 NVARCHAR(25) DECLARE @受注日 SMALLDATETIME DECLARE @金額 INT DECLARE @ステータス BIT DECLARE @有効フラグ BIT --カーソル宣言 DECLARE 販売カーソル CURSOR FOR SELECT 販売NO, 顧客NO, 明細, 受注日, 金額, ステータス, 有効フラグ FROM 販売 WHERE YEAR(受注日) = YEAR(GETDATE()) AND MONTH(受注日) < MONTH(GETDATE()) --初期化処理 SET NOCOUNT OFF --カーソルOPEN OPEN 販売カーソル FETCH NEXT FROM 販売カーソル INTO @販売NO, @顧客NO, @明細, @受注日, @金額, @ステータス, @有効フラグ WHILE @@FETCH_STATUS = 0 BEGIN INSERT INTO 販売 ( 販売NO, 顧客NO, 明細, 受注日, 金額, ステータス, 有効フラグ, 登録日, 更新日, )VALUES( @販売NO, @顧客NO, @明細, @受注日, @金額, @ステータス, @有効フラグ, GETDATE(), GETDATE(), ) FETCH NEXT FROM 販売カーソル INTO @販売NO, @顧客NO, @明細, @受注日, @金額, @ステータス, @有効フラグ END CLOSE 販売カーソル DEALLOCATE 販売カーソル END 同じテーブルを使用する場合は、このような記述ではできないのでしょうか?

  • SQLServer2005のSELECT文作成について

    SQLServer2005初心者ですが、おわかりになる方いらっしゃいましたら、教えてください。お願いします。 やりたいことは(下記は間違いのSELECT文ですが) SELECT Nomber , SUM(ISNULL(CASE WHEN KenYY + KenMM = '200711' THEN Siyoryo ELSE 0 END, 0)) AS '2007年11月' , SUM(ISNULL(CASE WHEN KenYY + KenMM = '200712' THEN Siyoryo ELSE 0 END, 0)) AS '2007年12月' ,  MAX(ISNULL(CASE WHEN RecNO = MIN(RecNO) THEN Sedai ELSE '' END, '')) Sedai_MIN ,  MAX(ISNULL(CASE WHEN RecNO = MAX(RecNO) THEN Sedai ELSE '' END, '')) Sedai_MAX FROM TABLE GROUP BY Nomber で、SELECTの最後のSedai_MIN,Sedai_MAXで集計関数を2回使っているので、エラーがでるのは分かるのですが、始めのMAXを消すとGROUPBY句にSedaiとRecNOが含まれていないというエラーがでて、GROUPBYに追加すると、同じNomberが複数でてしまうのです。 同じNomberは1つしか出ないようにする場合、上記のSELECT文をどのように変更すればよろしいのでしょうか? 回答よろしくお願いいたします。

  • 特定条件でWHERE句の条件を変更したい

    @jouken int @sql varchar(MAX) @select varchar(MAX) @where varchar(MAX) set @select = 'select * from table1' set @where = ' where case when @jouken = 0 then 'field1 = 1' when @jouken = 1 then 'field1 = 1 or field2 = 1' when @jouken = 2 then 'field1 = 1 or field2 = 1 or field3 = 1' end ' set @sql=@select+@where exec(@sql) 上記のような文字列の組み合わせでの作成でやりたいことはできたのですが、 こちらを直接SQLの中でやりたいのです。 以下の文は機能しません。 select * from table1 where case when @jouken = 0 then field1 = 1 when @jouken = 1 then field1 = 1 or field2 = 1 when @jouken = 2 then field1 = 1 or field2 = 1 or field3 = 1 end ご教授の程、よろしくお願い致します

  • T-SQL ユーザ定義関数 指定したバイト数までの文字列を返したい

    お世話になります。 SQLserver2005でユーザー定義関数に初めてトライしているのですが デバッグツールがなく、うまく動かない理由がわからず困っております。 ある文字列に対して、指定したバイト数までの文字を返すような関数を作りたいです。VBAでいうLEFT関数のバイト数指定版というのでしょうか。(すでにそんな関数があったりして。。) 以下のように作ってみたのですが、無限ループのようで、いつまでたってもデータが返ってきません。。どなたか教えていただけませんでしょうか? set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go CREATE FUNCTION [dbo].[LeftByte] (@value nvarchar,@maxbyte bigint) RETURNS nvarchar(max) AS BEGIN declare @Countvalue as bigint declare @byte as bigint declare @result as nvarchar select @byte = 0 select @Countvalue = 0 select @result = '' while @byte < @maxbyte begin select @Countvalue = (@Countvalue + 1) select @result = (left(@value,@Countvalue)) select @byte = (datalength(@result)) if @byte >= @maxbyte break else continue end RETURN @result END 宜しくお願い致します。

  • phpからquery実行

    趣味でサーバー構築を楽しんでいます phpからqueryでデータを渡そうとしたところ詰まってしまい、どうにも分からないので質問します //MSSQLQuery// DECLARE @acct varchar(32); SET @acct = 'testname'; INSERT INTO test.dbo.tblInfoA (Number,ID,) SELECT Number,@acct FROM test.dbo.tblinfoB WHERE userId = @acct このクエリをphpフォームからDBに送りたく下記をphpに記述しました */php mssql_query("INSERT INTO test.dbo.tblInfoA (Number,ID) VALUES ('SELECT Number FROM test.dbo.tblinfoB WHERE userId = $login','$login');") エラーメッセージ message: Conversion failed when converting the varchar value 'SELECT Number FROM test.dbo.tblinfoB WHERE userId = name' to data type int. (severity 16) お分かりの方いましたらご返答よろしくお願いします。