• 締切済み

毎回変わる列名からの集計

ストアドプロシージャから列を動的に作成するテーブルがあるのですが、 そのテーブルを別のプロシージャ内で集計を行いたいのです。 ##TEMPテーブル ID,3/1,3/5,3/16,3/24 1000,1,4,3,4 1001,2,3,4,2 1002,1,2,1,2 (月日の列の部分が動的に変わります) このテーブルともうひとつあるT_顧客が IDでつながっているとして T_顧客のなかの顧客名だけ表示してあとは##TEMPの 内容をすべて表示したい場合どういったSQLにすればよいか もしヒントでもよろしいですので なにかご教授いただけますと幸いです。

みんなの回答

  • utakataXEX
  • ベストアンサー率69% (711/1018)
回答No.1

集計の単位が ID だとして ##TEMPテーブル を作成した 時点で集計してしまうのはダメですか? (集計しない生データを後で使う必要がなければ) その状態が ##TEMPテーブル ID,3/1,3/5,3/16,3/24 1000,1,4,3,4 1001,2,3,4,2 1002,1,2,1,2 想定します。さらにT_顧客の顧客名の列名を「顧客名」と して、別プロシージャ側では単純に結合すれば、  ↓ select c.顧客名,tmp.* from ##TEMPテーブル tmp inner join T_顧客 c on tmp.ID = c.ID すべてをストアド内で解決しなければならないとなると、 面倒そうですが、ストアドをコールするのが他のアプリ だとすると、例えば、ADOなら、上記のように列名が不定 でもLOOPで表示可能なのでアプリ側で編集できますよね。 (ストアドの結果をレコードセットで受けるのは今日的 とは言えないけど) 蛇足ですが、##TEMPテーブル はセッションが切断された 時点でなくなる事はご存知ですよね?

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

関連するQ&A

  • クロス集計で、列を動的に

    SQLserverでのクロス集計についてご質問ですが、 クロス集計後の結果、列を動的に変更させる必要がある場合、ストアドプロシージャで処理しなければならないかとは思うのですが、 例えば T_売上 番号,日付,数 1,2004/09/10,10 1,2004/09/14,20 1,2004/09/18,10 2,2004/09/10,20 2,2004/09/14,20 3,2004/09/18,10 を 番号,2004/09/10,2004/09/14,2004/09/18 1,10,20,10 2,20,20,0 3,0,0,10 という形に出力したいときは、具体的にどういう手順でSSQLを作成していけばよろしいでしょうか。 (日付部分が動的に増えたり減ったりします)

  • T-SQLで一時テーブルの名前を毎回変更できるストアドを作りたい

    お世話になります。 初歩的な質問で恐縮ですがご教示いただければ幸いです。 T-SQLでグローバル一時テーブルの名前を毎回変更できるストアドを作り、Access2003アプリから実行させる予定です。 ストアドに、CREATE TABLE [dbo].[@tablename]のように書き、 ストアド実行時に@tablenameの値を ##ABC のように入力したのですが、テーブルはtempdbではなく、しかもテーブル名は@tablenameでテーブルが作成されてしまいます。 CREATE TABLE [dbo].@tablename のように[]をとると ストアド自体を作成できずエラーになってしまいます。 宜しくお願いします。 create PROCEDURE [dbo].[ストアドプロシージャー名] (@tablename nvarchar(255)) AS BEGIN from SET NOCOUNT ON; CREATE TABLE [dbo].[@tablename] <以下省略>

  • MySQLでの集計

    いつもお世話になっております。MySQLを利用しておりまして質問です。 同じ構成のテーブルが5つあり、選択されたテーブルを集計するSQLを作成しています。 カラムを簡単に構成を書くと ID、名前、ステータス1、ステータス2 のような形です。 テーブル1、2、3が選択された場合 テーブル1と2でIDの重複のない一覧を作成し、IDが被っていた場合はステータスをそれぞれ大きいほうを保持するようにします。 そして次にテーブル1、2を合わせたテーブルとテーブル3で同じように集計をしたいのですが、ここがうまく出来ません。 実際の環境ではなく簡素化したものなのでおかしな点があるかもしれませんがこのようになっています。 SELECT TTT1.id,TTT1.名前,TTT1.st1,TTT1.st2 FROM(     SELECT id,名前,ステータス1 as st1,ステータス2 as st2     FROM(        SELECT *        FROM テーブル1 T1        WHERE T1.id NOT IN(SELECT T2.id FROM テーブル2 T2)        UNION All        SELECT *        FROM テーブル2 T2        WHERE T2.id NOT IN(SELECT T1.id FROM テーブル T1)     ) as TT1     UNION     SELECT id,名前,st1,st2     FROM(         SELECT T1.id,T1.名前,         (CASE T1.ステータス1 or T2.ステータス1 WHEN "2" THEN "2" WHEN "1" THEN "1" WHEN "0" THEN "0" ELSE null END) as st1,         (CASE T1.ステータス2 or T2.ステータス2 WHEN "2" THEN "2" WHEN "1" THEN "1" WHEN "0" THEN "0" ELSE null END) as st2,         FROM テーブル1 T1,テーブル2 T2         WHERE T1.id = T2.id AND NOT(T1.st1 IS null AND T1.st2 IS null AND T2.st1 IS null AND T2.st2 IS null) ) as TT2 )as TTT1 /* UNION ALL SELECT id,名前,st1,st2 FROM (TTT1とテーブル3を比較したもの)as TTT2 */ /**/で囲ったところでTTT1が呼び出せれば、テーブル1のところをTTT1にし、テーブル2をテーブル3にすれば出来ると思うのですが、そういうことは無理なのでしょうか? また集計するテーブルの数が不特定なので一つずつ集計をする形を取りましたが、 もっとこういう風にやればいいと言う方法はございますでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 集計するためのSQL構文を教えて下さい。

    初めて投稿します。よろしくお願いします。 現在、ストアドプロシージャとSQLの勉強をしながら作業を行なっています。そのため説明不足などありましたらご指摘願います。 [環境]  データベース:SQLServer2005  SQL作成環境 :SQLServerManagementStudioExpress(9.00.2047.00) 望んでいる出力結果 病室,タイプ,10/01水,10/02木,10/03金,10/04土,10/05日 -------------------------------------------------------------- 10,集合3,○○太郎,○○太郎,○○太郎,○○太郎,□□花子        △△太郎,△△太郎,□□花子,□□花子        □□花子,□□花子 11,個室A,          ××太郎,××太郎,××太郎 12,個室B,     ○○次郎,○○次郎,○○次郎,○○次郎 ※指定した日付範囲で、全病室を対象に入院中患者、入院予定患者を  病室単位で求めたいです。 関係するテーブル情報 ※マスタテーブルは、名称+Mで表記します。 ※データテーブルは、名称+Tで表記します。 [病室] 病室M(  病室番号 INT  タイプコード INT ) [日付] ストアドのパラメータで集計開始日と終了日を受け取るため、 その集計範囲も動的に変わります。 ※上記の結果では、  集計日(自):2008/10/01  集計日(至):2008/10/05 を受け取った場合を想定し記述しています。 [入院者氏名] 患者T(  患者コード INT  患者氏名 VARCHAR(128)  通院種別 TINYINT(1:通院,2:入院)  退院区分 TINYINT(1:入院,2:退院)  入院日 SMALLDATETIME  退院日 SMALLDATETIME ) [患者と病室を紐付けるテーブル] 病室割当T(  割当番号 INT  患者番号 INT  病室番号 INT ) 長文となり申し訳ありません。 上記の情報でストアドを組もうとしているのですが、 SQL含め勉強不足な状態です。 実現するための考え方、方法、アドバイス等を頂きたいです。 よろしくお願い致します。

  • このような結果が得られるSQL文はどのように書けばいいのでしょうか?

    お世話になります。 どなたかご教授下さい。 下記のようなテーブルが2つあります。 table1 ・customer_id ・fromdate ・todate table2 ・customer_id ・executedate ・amount やりたいことは、顧客([customer_id])ごとに集計期間(executedate between [fromdate] and [todate])が異なるのですが、 その顧客ごとの集計期間内における総数(sum([amount])を出したいのです。 ただ、どのようにSQLを書けばいいのか検討がつかないので、どなたかご教授いただければなと思います。

  • SQLの実行速度

    XMLを解析し、テーブル内を検索するシステムを 作成しているのですが、 ストアドプロシージャ内でSQL文を作成し実行するのと ASP.NET などからSQL文を作成して実行するのとでは、 実行速度に差はでるのものなのでしょうか。 ・SQLServer 2005 ・SELECT の対象テーブルは2~3つのテーブルをINNER JOIN して使う。 ・検索対象の列は実行のたびに異なる。 よろしくおねがいします。

  • Access2003 クロス集計クエリでの合計

    ☆以下のようなテーブルで、フィールド[ID]~[C]があり、文字および数字のデータが混在しています。   ↓  ↓  ↓  ↓  ↓  ↓  ↓  ↓ =========================================== (テーブル(1)) [ID]  [A]      [B]    [C]     1    111     英語    10    2    222     英語    20    3    333     数学    30    4    111     国語    40   5    222     数学    50    6    333     国語    60    7    222     国語    70   8    333     英語    80     9    111     数学    90     =========================================== [課題] クロス集計クエリを作成する (1) フィールド[A]を行見出しに設定、    フィールド[B]を列見出しに設定、    フィールド[C]を集計する項目に設定する。   (2) フィールド[C]の値を列ごとに平均を計算し、    行ごとに合計を計算する。   ※ 列と行で、それぞれ集計した値を表示する   ↓  ↓  ↓  ↓  ↓  ↓  ↓  ↓ =========================================== [クロス集計結果]     合計  英語  国語  数学     111  140   10    40    90        222  140   20    70    50     333  170   80    60    30  --------------- 平均  150   36     56   56 ===========================================   ↑  ↑  ↑  ↑  ↑  ↑  ↑  ↑    上記のようなクロス集計クエリの結果を表示させたいのですが、 どうすればよろしいでしょうか? また、クエリだけでは出来ない場合は、SQLで教えていただければ幸いでございます。 お手数お掛けしますが、何とぞ宜しくお願い致します。

  • ストアドプロシージャでcsvファイルへデータにエクスポート

    いつも勉強させていただいています。 ストアドプロシージャの勉強をし始めて間もない素人ですがよろしくお願いします。 SQL-server2005でテーブルをCSVファイルに、ストアドプロシージャを使ってそのままエクスポートする、と言うことをやっています。 以下作成したストアドプロシージャです。 ******************************************* CREATE PROCEDURE [ストプロ名] AS DECLARE @command VARCHAR(200) BEGIN SET @command = ' bcp [データベース名].[スキーマ].[テーブル] out C:\XXXX\aaa.txt -PXXXXXX -UXXXXXX -SXXXXXX' EXECUTE master.dbo.xp_cmdshell @command END **************************************** 解析ボタン、実行ボタンをクリックしてもエラーは出ません。 「ストアドプロシージャの実行」を選択して実行させても、 アラーは表示されず、ファイルも作成されません。 xp_cmdshell が有効になるように設定もしました。 残念ながら検討すらつかない状態です。ぜひご教授お願いします。

  • クエリビルダで列名を変数にしたいが

    VisualStudio2010でwebアプリを作成しています。 クエリビルダでSQL文を作成しSQLサーバにアクセスしています。 このSQL文でわからない点があります。 列1、列2、列3のフィールドを持つテーブルがあるとします。 ドロップダウンリストで選択した項目により、ある時は列1だけ取得し ある時は列2だけ取得し、ある時は列3だけ取得する様なSQL文を作りたいのですが、どうすればよいかわかりません、列名を変数にできればよさそうなんですが、そんなことできますか? ある時は SELECT 列1 FROM table1 ある時は SELECT 列2 FROM table1 ある時は SELECT 列3 FROM table1 としたいので   SELECT @列名 FROM table @列名は変数のつもりです。 このようにできればよいと思っていますが・・・ よろしくおねがいします

  • ジョブでvbsを起動する方法

    ジョブでバッチ処理を作成していますが、テーブルからある数式を文字列として取得し、文字列内にある変数を実際の値と置き換え、それを数式として処理する必要があります。 T-SQLにはその機能がないため、vbsのEVAL関数を使って処理しようと考えています。 テーブルから取得した数式を直接SQL文に記述し、「数式 AS フィールド名」として取得しようとも考えましたが、数式に^(べき乗)が存在し、数式をT-SQLに変換することが複雑になってしまうため、あきらめました。 SQLServerのジョブ(もしくはストアドプロシージャ内)からパラメータを与えてVBSを実行させ、VBSより結果を返してもらうコーディング(設定)はどうすればできるのでしょうか?

このQ&Aのポイント
  • Brother DCP-J552Nを無線LANに設定した後、印刷ができないエラーが発生しています。取説に従って設定を行ったが、なぜか無線で印刷ができません。再起動や電源の入れ直しを行っても改善されず、ネットワーク設定情報に<Wireless Statistics> RX Frames Error 14, TX Frames Error 0というエラーコードが表示されます。
  • Windows環境で使用しているBrother DCP-J552Nを無線LANに接続しましたが、印刷ができない問題が発生しています。設定は取説に従って行ったが、再起動や電源の再接続を試しても解決されません。ネットワーク設定情報にエラーコードが表示されています。
  • 無線LANに設定したBrother DCP-J552Nで印刷ができません。設定は取説通りに行いましたが、再起動や電源の再接続を行っても改善されません。ネットワーク設定情報にエラーコードが表示されています。
回答を見る