元のテーブルの順で結果を取得したい


お世話になります。
VBA SQL Sever で作成しております。

以下のSQLを実行しているのですが、
私が欲しい結果としては、
------------------------------------
部材   用紙銘柄 用紙代理店,SUM(枚数)
本文   A     あ     50
前見返し B     あ 10
後見返し C     あ 20
表紙 D     あ 10


なのですが、結果が
------------------------------------
部材   用紙銘柄 用紙代理店,SUM(枚数)
本文   A     あ     50
前見返し B     あ 10
表紙 D     あ 10
後見返し C     あ 20

の形で出てしまいます。
※部材の順が
元のテーブルの上から順の
本文・前見返し・後見返し・表紙
ではなく、
本文・前見返し・表紙・後見返し
の順になってしまう。



どのようにすれば、希望する結果が獲れるのか
教えて頂けないでしょうか?



---------------SQL文----------------------
SELECT
部材,用紙銘柄,用紙代理店,SUM(枚数)


FROM
[用紙枚数計算シート$]

GROUP BY
部材,用紙代理店,用紙銘柄




----------テーブル----------------------
部材 用紙銘柄 用紙代理店 枚数
本文 A あ 10
本文 A あ 10
本文 A あ 10
本文 A あ 10
本文 A あ 10
前見返し B い 10
後見返し C い 20
表紙 D う 10




何卒宜しくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

No.1です。



> 「データを追加した順」に取得する方法がわからないのです。。。
> ※部材の昇順等ではなく、「データを追加した順」

No.1に書きましたとおりデータベースのテーブルにデータの追加日時といった項目を設けない限りそのような順番にはなりません。
そこのご理解が出来ておられないようで。。。

例えばご質問の最後に書かれているテーブルの場合、、、

「部材」、「用紙銘柄」、「用紙代理店」、「枚数」

という既存の4項目に加え「追加日」といった項目を設け、検索結果をこの項目の昇順に取り出すようにされればよいです。
なお、項目「枚数」が常に更新される値の場合、「データを追加した順」とはどうい意味合いになるかの仕様をよくお考えになって決める必要があるかと思います。

参考まで。
    • good
    • 0
この回答へのお礼

ありがとうございます!!

できました!!!

お礼日時:2017/04/21 11:01

「元のテーブルの順」と言われ、ご質問の最後に書かれたテーブルのところにレコードを書かれていますが、これは「データを追加した順」ということを言われてますか?


データベースのテーブルにデータの追加日時といった項目を設けない限りそのような順番にはなりません。
そうではなく、「部材の昇順、更に(部材が同値の場合は)用紙銘柄の昇順、更に(用紙銘柄が同値の場合は)・・・」という具合に並べたいということでしたら、ORDER BY句でそのことを指定して取り出してあげないと思うようには並びません。

以下My SQLの解説ページですが参考に。

https://www.dbonline.jp/mysql/select/index11.html
    • good
    • 0
この回答へのお礼

ご返事ありがとうございます。

order by句を使用するのはわかっているのですが、
「データを追加した順」に取得する方法がわからないのです。。。
※部材の昇順等ではなく、「データを追加した順」

もし、技術的にご存知でしたら教えて頂ければありがたいです。

よろしくお願いいたします。

お礼日時:2017/04/18 14:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aと関連する良く見られている質問

Q時間項目を60進数から10進数へ変換する方法

初めて質問させて頂きます。

現在テーブルの中に「時間の長さ」を管理している項目があります。

具体的には
・1時間30分ですと「130」
・10時間15分ですと「1015」
のように管理してあります。

この項目を10進数で表現し、更に時間を単位として算出したい状態です。


1時間30分ですと「130」なので「1.5(h)」として算出したいのです。

このように変換できるファンクションを作成しようとしているのですが、なかなかうまくいきません。
今試している方法としては
"時間"と"分"に分けて考えて、"分"は60で除算しようとしています。
それを足しこむ事で、上の例ですと「1 + 0.5 = 0.5」と算出しているのですが
"分"がうまく割り切れない場合の端数処理や例外の場合を考えると
どのようにファンクションを作ればよいか分からなくなってきました。

どなたか良い例を教えて頂けませんでしょうか。
よろしくおねがいします。

Aベストアンサー

何回もどうもすいません。忘れてました
VAR/60.00 などでもよいです。(暗黙の変換が効きます。)

QSQL Server で 翌月10日を取得する

SQL Server で 翌月10日を取得する方法を教えてください。

isnull(convert(char(10),dateadd(month,1,(dateadd(day,9,DATE))),111),'') as DATE

↑これだと、DATE(月末)の翌月の9日後で、翌月10日も可能なのですが、

当然ながら、DATEが月末とは限らないので。。。

常に10日を固定で表示するにはどうしたら、よいのでしょうか?

よろしくお願いいたします。

Aベストアンサー

こんにちは。
イノ(inno)です。

翌月10日を取得する時は下記のようにします。

DECLARE @Today DATETIME
SET @Today = GETDATE()

SELECT CONVERT(CHAR(7),DATEADD(MM,1,@Today), 111) + '/10'

これが一番簡単です。

@TodayにDATEADD(MM,1,@Today)をして翌月に移動します。
CONVERTを利用して'yyyy/MM/dd'形式に変換して前から7文字を切り取ります。
その後に'/10'をつけて'yyyy/MM/dd'に変更します。

上記の方法はSQL SERVERの全バージョンから使えます。
SQL SERVER 2012ならば「EOMONTH」を使って下記のように記述して取得することができます。

SELECT DATEADD(day, 10, EOMONTH(GETDATE()))

「EOMONTH」はSQL SERVER 2012以上から使えます。

QUNIONなどで複数のテーブルから上位10件などSELECTする方法

1店舗1テーブルのデータベースにしております。
全店の在庫を検索した時に、まとめてSELECTすると重いため、
TOP100などで、1~100,100~200などと分けたいです。
単テーブルでの分け方は何とか分かっていますが、
複数のテーブルをUNIONで結合した場合の分け方が分りません。

■ 現状:全店の在庫を各店のテーブルより、取得しています。

SELECT dbo.A店TB.ID, dbo.A店TB.BRAND, dbo.A店TB.CODE, dbo.A店TB.STOCK, dbo.A店TB.STORE FROM dbo.A店TB"
+ " where dbo.A店TB.CODE like '%" + txbCode.Text + "%' AND"
+ " dbo.A店TB.BRAND like '%" + txbBrand.Text + "%' AND"
+ " dbo.A店TB.STOCK > 0"
+ " UNION "
+ "SELECT dbo.B店TB.ID, dbo.B店TB.BRAND, dbo.B店TB.CODE, dbo.B店TB.STOCK, dbo.B店TB.STORE FROM dbo.B店TB"
+ " where dbo.B店TB.CODE like '%" + txbCode.Text + "%' AND"
+ " dbo.B店TB.BRAND like '%" + txbBrand.Text + "%' AND"
+ " dbo.B店TB.STOCK > 0"
+ " UNION "
+ "SELECT dbo.C店TB.ID, dbo.C店TB.BRAND, dbo.C店TB.CODE, dbo.C店TB.STOCK, dbo.C店TB.STORE FROM dbo.C店TB"
+ " where dbo.C店TB.CODE like '%" + txbCode.Text + "%' AND"
+ " dbo.C店TB.BRAND like '%" + txbBrand.Text + "%' AND"
+ " dbo.C店TB.STOCK > 0"

■ 問題:1店舗、1万レコード(件)のデータがあり、実際には10店舗ほどからデータを取ってくるため、読み込みに時間がかかってしまいます。

■ やりたいこと:最初の100件だけをSQLのSELECTで取得するクエリを書きたいです。別のプログラムで以下のように書きましたが、
これを上記のUNIONを使ったクエリでもやりたいと考えています。具体的なコードが思いつきません。お願いします。

SELECT TOP 100 BlogTB.TITLE,BlogTB.TEXT "
+ "FROM BlogTB WHERE ID NOT IN(SELECT TOP 200 ID FROM BlogTB ORDER BY ID DESC) ORDER BY ID DESC"

1店舗1テーブルのデータベースにしております。
全店の在庫を検索した時に、まとめてSELECTすると重いため、
TOP100などで、1~100,100~200などと分けたいです。
単テーブルでの分け方は何とか分かっていますが、
複数のテーブルをUNIONで結合した場合の分け方が分りません。

■ 現状:全店の在庫を各店のテーブルより、取得しています。

SELECT dbo.A店TB.ID, dbo.A店TB.BRAND, dbo.A店TB.CODE, dbo.A店TB.STOCK, dbo.A店TB.STORE FROM dbo.A店TB"
+ " where dbo.A店TB.CODE like '%" + txbCode.T...続きを読む

Aベストアンサー

UNION文全体を括って、TOP100を切ればいいでしょう。

SELECT TOP 100 *
FROM
(SELECT dbo.A店TB.ID, ・・(略)FROM dbo.A店TB
WHERE (略)
UNION
SELECT dbo.C店TB.ID, ・・(略)FROM dbo.C店TB
WHERE (略)
UNION
SELECT dbo.C店TB.ID, ・・(略)FROM dbo.C店TB
WHERE (略)
) tmp
ORDER BY ...

通常SQL Serverでこのように書くと、それぞれのベーステーブルに対して最大でTOP 100がかかるようにプランされるはずです。


このQ&Aを見た人がよく見るQ&A

おすすめ情報