• 締切済み

SQL Server 2008 0で除算ができません。

はじめまして、初投稿です。 初歩的な質問となるかもしれませんが、お答えください。 SQL Server Reporting Service 2008を使用しております。 表の中で率を計算し、出力する際に、 0で除算しましたとエラーが出てしまいます。 以下、設定内容です。 ■解決目標■ プレースホルダにて、率を出力したい(クエリ内では行わない) ■プレースホルダ プロパティ■ =IIF(sum(Fields!案件数.Value)=0,0,sum(Fields!受注件数.Value)/sum(Fields!案件数.Value)) ■クエリ■ select isnull(SUM(orders),0) as '受注件数', isnull(SUM(loss),0) as '失注件数', isnull(SUM(orders),0)+isnull(SUM(loss),0) as '案件数' from ~ ■エラー文■ 警告 1 [rsRuntimeErrorInExpression] textrun '受注率.Paragraphs[0].TextRuns[0]' の Value 式にエラーが含まれています。0 で除算しようとしました。 できましたら、早急なご回答をお願いいたします。

みんなの回答

  • YEND77
  • ベストアンサー率56% (21/37)
回答No.1

(SQL Server Reporting Service 2008は触った事ないので、ご参考まで) コンピュータの世界(?)では0で除算自体がなんだか悪なので それを避けるように設計をするのがスジです。 あとは決め事なんで、その要件にあわせて、なんかをします。 ブランクとしたり、エラーとするなり、割られる側も0ならば1としたりとかとか。。

関連するQ&A

  • accessからexcelへ出力時。。。

    3つのクエリを一つのエクセルシートへ出力しようとしているのですが、 3つ目が張り付きません。なんでなんでしょうか?どなたか教えてください。 Dim dbs As Database Dim rst1 As Recordset Dim rst2 As Recordset Dim rst3 As Recordset Dim intRow As Integer Dim intCell As Integer Dim xlsx As Object Set dbs = CurrentDb Set rst1 = dbs.OpenRecordset("クエリA") Set rst2 = dbs.OpenRecordset("クエリB") Set rst3 = dbs.OpenRecordset("クエリC") Set xlsx = CreateObject("Excel.Application") 'Excelオブジェクトを生成 With xlsx .ScreenUpdating = False '画面の再描画を抑止 .Workbooks.Add '新しいブックを追加 '---"クエリA"---------------------------------------------------- intRow = 1 For intCell = 1 To rst1.Fields.Count .Cells(intRow, intCell).Value = rst1.Fields(intCell - 1).Name .Cells(intRow, intCell).Interior.ColorIndex = 15 Next intCell '各レコード出力 intRow = 2 Do Until rst1.EOF For intCell = 1 To rst1.Fields.Count .Cells(intRow, intCell).Value = rst1.Fields(intCell - 1) Next intCell intRow = intRow + 1 rst1.MoveNext Loop '集計Sum For intCell = 4 To rst1.Fields.Count .Cells(intRow + 1, intCell) = "=SUM(" & Cells(2, intCell).Address & ":" & Cells(intRow, intCell).Address & ")" Next intCell ・ ・2目のクエリはOK ・ ・ ’以下3つ目のクエリ Dim intRow3 As Integer Dim intCell3 As Integer intRow3 = intRow + 5 intCell3 = 5 For intCell3 = 5 To rst3.Fields.Count .Cells(intRow3, intCell3).Value = rst3.Fields(intCell3 - 1).Name .Cells(intRow3, intCell3).Interior.ColorIndex = 15 Next intCell3 '各レコード出力 intRow3 = intRow + 6 Do Until rst3.EOF For intCell3 = 5 To rst3.Fields.Count .Cells(intRow3, intCell3).Value = rst3.Fields(intCell3 - 1) Next intCell3 intRow3 = intRow3 + 1 rst3.MoveNext Loop '---- Dim rst3RC As Integer rst3RC = intRow + 5 + rst3.RecordCount '863 '集計Sum For intCell3 = 6 To rst3.Fields.Count - 1 .Cells(rst3RC, intCell3) = "=SUM(" & Cells(rst3RC - rst3.RecordCount, intCell3).Address & ":" & Cells(rst3RC - 1, intCell3).Address & ")" Next intCell3

  • クエリにSQL文を書き込みたい

    アクセス2000にてソフト開発しています Q受注グラフというクエリがあります。 データが毎月変化するので、これにVB内に記述したSQL文を書き込みたいのですが、どの様にすれば いいのでしょうか ちなみにSQL文は下記です。 SQL = "SELECT JS.受注年月, JS.部署名, JS.当月受注実績 AS 当月, " & _ "(JY.請負1*10000) AS " & m当月 & ", (JY.請負2*10000) AS " & m翌月 & ", (JY.請負3*10000) AS " & m翌々月 & ", " & _ "FORMAT((JS.受注達成率*100),""###.#"") AS [受注達成率(%)]" & _ "FROM T受注実績集計 AS JS INNER JOIN (T受注予定集計 AS JY INNER JOIN 部署コード AS BC ON JY.部署コード = BC.施工部署コード) " & _ "ON (JY.部署コード = JS.部署コード) AND (JY.実績年月 = JS.受注年月)" & _ "WHERE JS.受注年月 = '" & m実績月 & "'" & _ "ORDER BY BC.部署コード;" 宜しく御願いします

  • 【再】2)-SQL文の書き方を教えてください。

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=694458 先日この問題で投稿しましたが、未完成のため、再度要望を整理し、ご指導をお願いいたします。 W←tabel名:名称、日付、数量 明細データ:     名称   日付    数量 A   2003/10/01   200 B   2003/10/03   500 C   2003/10/10   4000 A   2003/10/03   200 A   2003/10/03   100 C   2003/10/15   100 B   2003/10/15   300 C   2003/10/15   50 B   2003/10/15   60 求めているクエリーのイメージ:    2003/10/15 時点 ================================================ 名称     当日数量     当月数量     A          0       300     B         360       860     C         150       4150 ------------------------------------------------- 先日教えてもらったSQL文、希望のクエリーを作れないです。 -------------------------------------------------- select 名称, sum(AAA) as 当日数量, sum(BBB) as 当月数量 from ( select 名称, 0 as AAA, sum(数量) as BBB from W where 日付 >= #2003/10/01# and 日付 <= #2003/10/15# group by 名称 union select 名称, sum(数量) as AAA, 0 as BBB from W where 日付 = #2003/10/15# group by 名称 ) group by 名称; このSQL文は、2番目のSelectのところでエラーが出る (From句の構文エラーです) -------------------------------------------------- 後、Accessバージョンによって、SQL文が変わるでしょうか?当方は、Access97を使っている。 ご指導をお願いいたします。

  • Distinct使用時に0除算エラーが起こる

    初めて投稿します。よろしくお願いします。 現在、VB6とアクセス97で構築されたシステムのメンテナンスを行なっています。下記SQLの実行時に0で除算しましたのエラーが出ます。 select * from [ SELECT DISTINCT NO FROM 指示書]. AS NOリスト order by iif(NO = "0", 9999999 ,NO) 色々試してみましたが解決方法が見つからないので質問しました。 ちなみに、アクセス内で"SELECT DISTINCT NO FROM 指示書"というクエリを作成し実行しておくとエラーが出ずに正常に動作します。 よろしければ、ご教授よろしくお願いします。

  • SQL SERVER 同一クエリ内での別名参照

    いつもお世話になります。 下記内容のクエリを作成したのですが、「エラー:列名’支給割合’が無効です」と表示されてしまいます。 SELECT CASE WHEN 種別 = 'A' THEN 0.5 ELSE 0.3 END AS 支給割合, CASE WHEN 進捗 = '完了' THEN ISNULL(粗利, 0) * 支給割合 ELSE NULL END AS 支給分 FROM dbo.取引マスタ 種別より、CASE式で支給割合を作成し、進捗より粗利に対して支給割合を掛ける関数を作成しようと思ったのですが、上記の通りエラーになってしまいます。 Accessと同様に同一のクエリ内で式に別名を指定して参照は出来ないのでしょうか?(表現が下手で申し訳ありません) ここからさらにCASE式を足して最終粗利益等を作成したいのですが・・・・ 使用DB:SQL Server 2008 R2 express edition 検索でも目当ての回答が見つけられず、こちらで質問をさせて頂きました。 ご教授を宜しくお願いいたします。

  • オーダーNo.毎に集計するSQL

    オーダーNo.毎に集計するSQLを考えているのですが、少しSELECT文法で行き詰まってしまったので教えてください。 オーダーNo.毎にグループ化して、コード別の件数を集計します。 そして、コードが「10」のものが1件でもあれば表示する、というようなことを考えています。 SELECT ORDERNO, SUM(CASE WHEN CODE = 0 THEN 1 ELSE 0 END) AS CODE0, SUM(CASE WHEN CODE = 10 THEN 1 ELSE 0 END) AS CODE10, SUM(CASE WHEN CODE > 0 THEN 1 ELSE 0 END) AS CODEALL FROM DBORDER WHERE SUM(CASE WHEN CODE = 10 THEN 1 ELSE 0 END) > 0 GROUP BY ORDERNO ORDER BY ORDERNO このようにすると、WHEREのところで構文エラーになります。 ここをどのように変えれば意図どおりの動きをするようになるのか知りたいです。 よろしくお願いします。

  • SQLについて教えてください。

    お世話になります。 ORACLE SQLについて質問させて下さい。 ACCESS2003より以下のようなSQLを発行しています。 SELECT A.商品CD, A.区分, SUM(A.数量) AS 受数量, SUM(A.金額) AS 受金額 FROM テーブル1 A INNER JOIN テーブル2 B ON SUBSTR(A.商品CD,1,13) = B.商品コード WHERE A.年 = 2008 AND A.月 = 03 AND B.区分 = '51' GROUP BY CUBE(A.商品CD, A.区分) ORDER BY A.商品CD, A.区分 集計のSQLです。 SQLは正しいと思うのですが、実行結果が返ってきません。0件です。 調べていたところ、SQLを発行した後のレコードカウントに 「実行時エラー '-2147467259' データプロバイダまたはほかのサービスがE_FAIL状態を返しました。」 とあり、件数が0件(SQL自体動いていない?)でした。 SQL自体は開発ツールとして使用している、「オブジェクトブラウザ」のSQL発行機能にて実際に動かしてデータも正しく抽出されることは確認してるいるのですが。。 他にネットで調査したところ、抽出件数が多すぎると上記のようなエラーが起こる?みたいな事も書いてありました。 しかし、結果の件数はそんなに多くはないのです。(200レコードくらい。) なぜ起こるか、どうすればいいか、が良く分かりません。。。 解決策、回避策がありましたら教えていただきたいと思います。 SQLを発行するサブルーチンも記載しておきます。 ↓↓↓ Public Function cmn_DoSelectSql(ByVal pstrSql As String, pstrData() As String) As Long Dim lngErrNum As Long 'エラー値 Dim strErrMsg As String 'エラーメッセージ Dim adoRs As ADODB.Recordset 'レコードセット Dim lngColCnt As Long '最大レコード数 Dim lngRowCnt As Long '最大フィールド数 Dim objField() As Object Dim lngCol As Long 'レコードカウントアップ用 Dim lngRow As Long 'フィールドカウントアップ用 On Error Resume Next cmn_DoSelectSql = 0 '変数初期化 g_lngOraRecCnt = 0 'パラメータチェック If pstrSql = "" Then Call cmn_ErrMsgDsp("-", "パラメータ異常が発生しました。") cmn_DoSelectSql = -9 Exit Function End If If (g_adoCon Is Nothing) Then Call cmn_ErrMsgDsp("-", "パラメータ異常が発生しました。") cmn_DoSelectSql = -9 Exit Function End If Set adoRs = New ADODB.Recordset adoRs.CursorLocation = adUseClient 'SQL実行 adoRs.Open pstrSql, g_adoCon, adOpenStatic, , adCmdText 'エラーセット lngErrNum = Err strErrMsg = Error(Err) 'エラーメッセージ表示 If (lngErrNum <> 0) Then Select Case lngErrNum '排他エラー Case 54: cmn_DoSelectSql = -2 'その他 Case Else Call cmn_ErrMsgDsp(lngErrNum, strErrMsg) cmn_DoSelectSql = -1 End Select GoTo sub_Exit End If '列数セット lngColCnt = adoRs.Fields.Count If adoRs.RecordCount > 0 Then ←ココに上記エラーメッセージが入ってきます。。。 g_lngOraRecCnt = adoRs.RecordCount lngRowCnt = adoRs.RecordCount '受渡用変数初期化 ReDim pstrData(1 To lngRowCnt, 1 To lngColCnt) Erase objField ReDim objField(0 To lngColCnt - 1) For lngCol = 0 To lngColCnt - 1 Set objField(lngCol) = adoRs.Fields(lngCol) Next lngCol '受渡用変数セット For lngRow = 0 To (lngRowCnt - 1) For lngCol = 0 To (lngColCnt - 1) pstrData(lngRow + 1, lngCol + 1) = Cmn_NullToSpace(objField(lngCol).Value) Next lngCol adoRs.MoveNext Next lngRow End If sub_Exit: If (Not adoRs Is Nothing) Then adoRs.Close Set adoRs = Nothing End If End Function 自分で開発したものではないのですが、コレといって間違いはないように思えます。。 もし何かありましたらアドバイス等お願い致します。 ・・・集計SQLは実行できないのでしょうか。。

  • SQL Server複数テーブルの連結

    在庫管理を行う上で、3つのテーブルを結合したいと考えておりますが、うまく結合できません。 【テーブル抜粋】 ・販売  販売日  部門CD  店舗CD  商品CD  販売数 ・仕入  仕入日  部門CD  店舗CD  商品CD  仕入数 ・棚卸  棚卸日  部門CD  店舗CD  商品CD  実在庫 各テーブルから、日付で絞りこんで抽出は出来ていますが、上記を結合させる方法がわかりません。 ※各テーブルの商品数がバラバラです。 例えば、棚卸にはあるが、仕入も販売もない商品。 販売にはあるが、在庫も仕入もない商品N。 試した方法、在庫を基本に販売をLEFT OUTER JOINで結合し、仕入をLEFT OUTER JOINで結合しGROUP BYで集計 SELECT 部門CD,店舗CD,商品CD,ISNULL(実在庫,0) AS Z,ISNULL(販売数,0) AS B,ISNULL(仕入数,0) AS S FROM( SELECT 部門CD,店舗CD,商品CD,SUM(実在庫) FROM 棚卸 WHERE 棚卸日 BETWEEN (開始日) AND (終了日) ORDER BY 部門CD,店舗CD,商品CD )AS ZAI LEFT OUTER JOIN( SELECT 部門CD,店舗CD,商品CD,SUM(販売数) FROM 販売 WHERE 販売日 BETWEEN (開始日) AND (終了日) ORDER BY 部門CD,店舗CD,商品CD ) AS BAI ON ZAI.商品CD=BAI.商品CD LEFT OUTER JOIN( SELECT 部門CD,店舗CD,商品CD,SUM(仕入) FROM 仕入 WHERE 仕入日 BETWEEN (開始日) AND (終了日) ORDER BY 部門CD,店舗CD,商品CD ) AS SII ON ZAI.商品CD=SII.商品CD 上記の結果、結合はしたのですが、店舗間の商品数がバラバラとなりました。 例えば、aという店舗の販売数に、b販売数がはいっていたらり? ※結合する前の、クエリは正常に抽出しておりますので、結合方法が悪いと考えております。 もしかすると、テーブルの項目をそろえて、UNION ALLでつなげばと思ったのですが、コーディング方法がわからす・・・ 結合方法をアドバイス頂けたら幸いです。

  • 受注から出荷までのリードタイムを集計するSQLの書き方

    データベースに受注テーブルがあり、 その項目として受注番号, 受注日, 出荷日があるとします。 <受注テーブル> 受注番号, 受注日, 出荷日 001, 2009/1/1, 2009/1/1 002, 2009/1/1, 2009/1/3 003, 2009/1/2, 2009/1/2 004, 2009/1/2, 2009/1/2 005, 2009/1/4, ... この受注テーブルを元に、受注から出荷までにかかる作業効率 (リードタイム)を見る表をMS-SQLで作りたいと思っています。 抽出条件としては受注月指定をして受注日を対象にします。 <出荷リードタイム> 受注日, 注文件数, 当日出荷, 翌日出荷, 翌々日以降出荷, 未出荷 2009/1/1, 2, 1, 0, 1, 0 2009/1/2, 2, 2, 0, 0, 0 2009/1/3, 0, 0, 0, 0, 0 2009/1/4, 1, 0, 0, 0, 1 SUM(CASE WHEN (DATEDIFF(DAY,[受注日], [出荷日]) = 0) THEN 1 END) AS [当日出荷] を利用して受注日をGroup Byすることで何となくは出来たのですが、 注文のない日(上の場合は2009/1/3)もリストとして出したいので、 もう一工夫必要なのかと思っています。 お知恵を拝借できたら幸いです。

  • VBA フォーム テキストBOX数値除算

    エクセル VBAのフォーム内数値の除算を行い 整数部分のみActiveSheetの指定セルに入力したいため 下記のように書き込みました。 Dim K As Integer Dim G As Integer Dim IRI As Integer G = 5 IRI = 50 For K = 3 To 47 If Controls("Textbox" & K) <> "" Then With ActiveSheet .Cells(G, 4) = Controls("textbox" & K).Value .Cells(G, 6) = "×" For IRI = 50 To 72 .Cells(G, 7) = Application.WorksheetFunction. _ QUOTIENT(Controls("textbox" & K).Value, Controls("textbox" & IRI).Value) Exit For Next IRI End With End If K = K + 1 Next K 上記内の .Cells(G, 7) = Application.WorksheetFunction. _ QUOTIENT(Controls("textbox" & K).Value, Controls("textbox" & IRI).Value) 部分で実行時エラーになってしまいます。 QUOTIENTを使用して色々な書込を試してみましたが うまく作動いたしません。 根本的に間違っているかと思いますがどの様に 修正すれば宜しいでしょうか?