質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

3013閲覧

SQLserverで、複数条件で1度でデータを取り出したい。

jal0994

総合スコア20

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/03/30 13:36

編集2016/03/30 14:44

entryDate |updateDate | status | num
2015-12-03 9:00:00 | 2015-12-02 9:00:00 | 10 | 3
2015-12-10 21:00:00 | 2015-12-10 21:00:00 | 10 | 20
2015-12-25 09:00:00 | 2016-02-02 21:00:00 | 11 | 5
2015-12-27 12:00:00 | 2016-02-13 21:00:00 | 11 | 3
2016-03-14 12:00:00 | 2015-03-14 12:00:00 | 10 | 12
2016-03-18 12:00:00 | 2015-03-18 12:00:00 | 10 | 2

上記のようなuriagedataというテーブルがあり、当月から1年前までのデータをsqlで取り出して下記のような表示をPHPで表示させたく思っています。

2016/03 | 2016/02 | 2016/01 | 2015/12 | ・・・

新規 14 | 0 | 0 | 23 |・・・
削除 0 | 8 | 0 | 0 |・・・

データの抽出条件は
新規がstatusが10でentryDateでgroup byして、月ごとにnumの合計値を算出。
削除がstatusが11でupdateDateでgroup byして、月ごとにnumの合計値を算出。

新規を取り出すSQL文は
SELECT convert(varchar(7),entryDate,111),count(*)
FROM uriagedata
WHERE status='10'
AND entryDate(select dateadd(year,(-1),getdate()))
GROUP BY convert(varchar(7),entryDate,111)

取り出されるデータは
date | total
2016/03 | 14
2015/12 | 23
です。

削除を取り出すSQL文は
SELECT convert(varchar(7),updateDate,111) AS date,count(*) AS total
FROM uriagedata
WHERE status='10'
AND updateDate(select dateadd(year,(-1),getdate()))
GROUP BY convert(varchar(7),updateDate,111)

取り出される結果は
date | total
2016/02 | 2
です。

希望のデータの取り出し方は、下記のように新規も削除も、データがない月でも、年月と0件を表示させたいです。
date | total
2016/03 | 14
2016/02 | 0
2016/01 | 0
2015/12 | 23
| |
2015/03 | ・・

今は2つのSQL文を作ってデータを取り出しているのですが、新規と削除のデーターを1つのSQL文で取り出す事は可能なのでしょうか?
もしくは今まで通りSQL文を2つ使って下記のようにデータを取り出すSQL文はあるのでしょうか?
ちなみに使っているのは、SQLserber2008で、entryDateなどを文字列にしてGROUP BYしているのも条件です。

新規
date | total
2016/03 | 14
2016/02 | 0
2016/01 | 0
2015/12 | 23
| |
2015/03 | ・・

削除
date | total
2016/03 | 0
2016/02 | 8
2016/01 | 0
2015/12 | 0
| |
2015/03 | ・・

もしお時間あればご教示いただければと思います。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

PIVOT関数があるそうですのでこれが使えるのでは?

SQLServerは使ったことないのでちゃんと動作するかわかりませんが、恐らくこんな感じ

SQL

1SELECT status,[2016/03],[2016/02],[2016/01] 2FROM ( 3 SELECT 4 CASE 5 WHEN status = 10 THEN CONVERT(VARCHAR(7), entryDate, 111) 6 WHEN status = 11 THEN CONVERT(VARCHAR(7), updateDate, 111) 7 END AS d 8 , status, num 9 FROM uriagedata 10) base 11PIVOT( 12 SUM (num) 13 FOR base.d IN ( [2016/03], [2016/02], [2016/01] ) 14) AS pvt 15WHERE base.d >= '2016/01'

これが動作したとして、PIVOTの値に関数の出力値が使えるなら、日付に直接値を入れているところは次のような形で置き換え可能かと

SQL

1CONVERT(VARCHAR(7), GETDATE(),111) //2016/03 2CONVERT(VARCHAR(7), DATEADD(MONTH,-1,GETDATE()),111) //2016/02

投稿2016/03/30 17:43

hirohiro

総合スコア2068

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jal0994

2016/04/03 02:09

なるほど!このような書き方もあるんですね!参考にさせていただきます!ありがとうございます!
guest

0

ベストアンサー

できなくはないけどといったところ。動作保証はしません。
再帰で12ヶ月のリストを作成。外部結合で新規、削除の合計件数を紐付け。

SQL

1 2WITH 3 calendar AS ( 4 SELECT 5 DATEADD(MONTH,-12,GETDATE()) AS value 6 UNION ALL 7 SELECT 8 DATEADD( MONTH, 1, value ) 9 FROM 10 calendar 11 WHERE 12 calendar.value < GETDATE() 13 ) 14SELECT 15 CONVERT(VARCHAR(7),calendar.value,111) AS month, 16 COALESCE(new_uriage.total,0) AS new_total, 17 COALESCE(del_uriage.total,0) AS del_total 18FROM 19 calendar 20 LEFT OUTER JOIN 21 ( 22 SELECT 23 CONVERT(VARCHAR(7),entryDate,111) AS month, 24 SUM(num) AS total 25 FROM 26 uriagedata 27 WHERE 28 status='10' AND 29 entryDate BETWEEN ( 30 SELECT 31 DATEADD(YEAR,(-1),GETDATE()) 32 ) AND GETDATE() 33 GROUP BY 34 CONVERT(VARCHAR(7),entryDate,111) 35 ) AS new_uriage ON 36 CONVERT(VARCHAR(7),calendar.value ,111)= new_uriage.month 37 LEFT OUTER JOIN 38 ( 39 SELECT 40 CONVERT(VARCHAR(7),updateDate,111) AS month, 41 SUM(num) AS total 42 FROM 43 uriagedata 44 WHERE 45 status='11' AND 46 updateDate BETWEEN ( 47 SELECT 48 DATEADD(YEAR,(-1),GETDATE()) 49 ) AND GETDATE() 50 GROUP BY 51 CONVERT(VARCHAR(7),updateDate,111) 52 ) AS del_uriage ON 53 CONVERT(VARCHAR(7),calendar.value ,111)= del_uriage.month;

投稿2016/03/30 16:26

編集2016/03/30 16:27
umed0025

総合スコア851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jal0994

2016/04/03 02:06

再帰SQLって初めて知りました。こんなやり方もあるんですね。すごいです!これなら出来そうですね!本当ありがとうございます!助かりました!
guest

0

安直ですが、Joinを使ってそれぞれの問い合わせ結果をFull outer joinして、それを福問い合わせにして、再度Selectでしょうか。
これだと、新規と削除の両方でデータが無い月は表示されませんが。

sql

1SELECT 2COALESCE(uriagedata.date, del_uriagedata.date) as date 3, uriagedata.total as total 4, del_uriagedata.total as del_total 5FROM ( 6SELECT 7convert(varchar(7),updateDate,111) AS date 8, count(*) AS total 9FROM uriagedata 10WHERE 11 status='10' 12 AND updateDate(select dateadd(year,(-1),getdate())) 13GROUP BY convert(varchar(7),updateDate,111) 14FULL OUTER JOIN ( 15SELECT 16 convert(varchar(7),updateDate,111) AS date 17 , count(*) AS total 18FROM uriagedata 19WHERE 20 status='11' 21 AND updateDate(select dateadd(year,(-1),getdate())) 22GROUP BY convert(varchar(7),updateDate,111) 23) as del_uriagedata 24ON uriagedata.date = del_uriagedata.date 25)

投稿2016/03/30 15:28

Odacchi

総合スコア907

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jal0994

2016/04/03 02:03

なるほど!ただデータがない月も0件で出したかったんですよねー。でもこんなやり方もあるんですね!勉強になりました!本当ありがとうございます!
guest

0

SQL Serverはよく分からないのですがUNIONって使えますか?
二つ以上のSELECTを連結するのに使いますけど…

投稿2016/03/30 14:57

shi_ue

総合スコア4437

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jal0994

2016/04/03 02:29

UNIONは使えますけど、データがない月を項目として表示させたりするのが分からなかったです。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問