ID  項目CD  評価結果
-------------------------
A   1-1-1   ○
A   1-1-1   ○
B   1-1-1   ×
C   1-1-1   ○
A   1-2-1   ○
A   1-2-1   ○ 
B   1-2-1   ○
C   1-2-1   〇

上記のテーブルがあります
評価結果は、○と×があり、項目CDごとに集計を行い、項目CDが同じ場合は、○がいつくあっても1とみなして計算するということをおこないたいです


理想SELECT結果

ID  合計 
--------------
A   2   (1-1-1で○が2つあるが、1つとして計算)
B   1   
C   2    


SELECT ID,SUM(評価結果) FROM TABLE GROUP BY ID

でIDと合計までは出せました

現在のSELECT結果

ID  合計 
--------------
A   4   (すべての○の合計を出力)
B   1   
C   2  

項目CDが同じ場合"○"を1つとして集計するにはどうすればいいのでしょか?

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

A 回答 (2件)

DB2とかORACLEなら通るはず。


SELECT ID,COUNT(DISTINCT 項目CD) FROM TABLE WHERE 評価結果=○
GROUP BY ID,項目CD

ACCESSなら、こっちで。
SELECT ID,COUNT(項目CD) FROM
(SELECT DISTINCT ID,項目CD FROM TABLE WHERE 評価結果="○")
GROUP BY ID

この回答への補足

期待した結果通りできましたありがとうございました。

補足日時:2009/05/26 10:47
    • good
    • 0

やり方はいろいろありそうだけど・・・。


select id, sum(評価結果) from (select distinct * from TABLE) as b group by id order by id
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

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

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

Q件数とデータを同時に取得するには?

1つのSQL文で件数とデータを取得したいのですが無理でしょうか?

イメージ図↓
SELECT カラム名,COUNT(*) FROM テーブル名;

COUNT  カラム名
-------------------
 3     データA
      データB
      データC

Aベストアンサー

select count(*) over (), t.* from t

Qjoinの場合のテーブル名の別名の使用方法

select * from table1 a,table2 b
where a.field1=b.field1;

とできますが

select * from table1 as a left join table2 as b
on a.field1=b.field1;

とできません。
joinの場合にテーブル名の別名を使う方法を教えてください

Aベストアンサー

当方、PostgreSQL 8.0を使っていますが、

select * from t1 as x left join t2 as y on x.c1=y.c1

という別名を使った構文は使えるようです。

また、以下のようにインラインビューにする方法はどうでしょうか?

select * from (select * from t1) as x left join (select * from t2) as y on x.c1=y.c1

QJava-jspの画面入力値保持について

画面にテキスト、ラジオボタン、リストボックス とボタンがあります。
ボタンを押すと、JAVAで処理を行い、jspのviewで表示します。

1.テキスト、ラジオボタン、リストボックスなどに値が入力、設定されている状態で
ボタンを押して処理後にテキスト、ラジオボタン、リストボックスの値が
変わらないようにしたいのですが、
その場合、たとえば、入力、設定値をセッションになどに格納しておき
jspの所で、セッションから値を設定すると言うような方法になるのでしょうか?

2.ボタン押して処理後、ラジオボタン、リストボックスの選択値も
  変えないようにしたいのですが、
  これはどのように実現するのが、適切なのでしょうか?


以上、よろしくお願いします。

Aベストアンサー

ボタンというのはフォームのサブミットボタンのことですよ?
つまり、画面遷移が起きることを前提とすると(元の同じ画面に戻るのも含みます)

テキスト、ラジオボタン、リストボックスの状態を「要求パラメータ」として
送信し、それを次画面に反映するというのが最も一般的な方法です。

フレームワーク struts のアクションフォーム&JSPカスタムタグを使うと比較的楽に
そういう画面が作れますが、多くのフレームワークでも大差ありません。
簡単な画面なら素のサーブレート+JSPでも十分作れます。

セッションでもできますが、 セッションはログイン情報などの保持など、
限定された範囲で使うのが普通です。また、結局セッションに最新の
テキスト、ラジオボタン、リストボックスの状態を送るには、「要求パラメータ」
を送信する必要があります。

AJAXを使うという方法もあります。この場合、ボタンは AJAX 処理だけを行い
画面遷移を起こさないので、サーバ側で画面のテキスト、ラジオボタン、
リストボックスの状態をもつ必要はありません。

Q2つの項目が重複するレコードを抽出する方法はありますか?

MySQL4.1で既存データに対し複合キーを新しく設定したいのですが、

ALTER TABLE `test` ADD PRIMARY KEY (`a`,`b`)

としても重複データが存在する為、作成できませんでした。

10万件あるテーブルから重複するレコードを手動で削除したいのですが、aとbが重複しているレコードだけ抽出するSQL文はありますでしょうか?

Aベストアンサー

select * from `test`
where (a,b) in(
select a,b from `test`
group by a,b
having count(*)>1)

Qtimestampのデータはどのようにして入力

するのでしょうか?

create table tablex(no serial primary key,time timestamp);

insert into tablex(time) values(?);

において?の部分に入れる文字列のフォーマットはどうなるのでしょうか?

例えば
2005年5月5日5時55分55秒
を入れるにはどうしたらいいのでしょうか?

Aベストアンサー

'2005-05-05 05:55:55'

Q残り時間カウントダウン表示 『あと○時間△分□秒』

CGIゲーム内であるイベントが発生してから12時間後に新イベントが自動発生するスクリプトを作りたいのですが

ネット検索をしても残り日数表示しかなくてサンプルがないので創ってみたのですが

<body onLoad="count()" onUnload="clearTimeout()">

$ENV{'TZ'} = "JST-9";
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); <=現在の時間

$date="0,0,11,3,0,107,0,27,0 485,197,854,"; <=保存されたプレイベント発生時間
foreach($date){ ($sc,$mi,$ho,$md,$mo,$ye,$wd,$yd,$isd)=split(/,/); }

print <<"EOM";

<SCRIPT language="JavaScript">
<!--
cnt = $sc-$sec;
cnt1=$mi-$min;
if($ho>$hour){cnt2=$ho-$hour-12;}
else{cnt2=$ho-$hour+12;}
if(cnt2>12){cnt2=cnt2-12;}
if(cnt<0){cnt=cnt+59; cnt1=cnt1-1;}
if(cnt1<0){cnt1=cnt1+59; cnt2=cnt2-1;}
if(cnt2<0){cnt=0;cnt1=0;cnt2=0;}

function count(){
document.form.box.value = cnt2+"時間"+cnt1+"分"+cnt+"秒";
cnt--;
if(cnt<0){cnt=cnt+60; cnt1=cnt1-1;}
if(cnt1<0){cnt1=cnt1+60; cnt2=cnt2-1;}
if(cnt2<0){cnt=0;cnt1=0;cnt2=0;}

if(cnt2 >=0) {
if(cnt1 >=0) {
if(cnt >=0) {
setTimeout("count()",1000);
}}}
}
//-->
</SCRIPT>

<FORM name="form">
あと<INPUT type="text" name="box" size="17">です
</FORM>
EOM

とりあえず表示はできた(と思う)のですがもっと楽で確実な方法はありますでしょうか?(モジュールとかは使わずに)

または上記のスクリプトすぐに思いつかなかったのでtime()で計算してたのですが
『残り53495秒』(適当)のような表記方法しか分かりません
これを○時間△分□秒のように変換してカウントダウンできるでしょうか?

localtime()、time()どちらでもいいのでご意見お願いします

CGIゲーム内であるイベントが発生してから12時間後に新イベントが自動発生するスクリプトを作りたいのですが

ネット検索をしても残り日数表示しかなくてサンプルがないので創ってみたのですが

<body onLoad="count()" onUnload="clearTimeout()">

$ENV{'TZ'} = "JST-9";
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); <=現在の時間

$date="0,0,11,3,0,107,0,27,0 485,197,854,"; <=保存されたプレイベント発生時間
foreach($date){ ($sc,$mi,$ho,$md,$mo,$ye,$wd...続きを読む

Aベストアンサー

こんにちは。

さてご質問にあった
----------------
『残り53495秒』
----------------
ですが、もし残り時間を「秒」で求める方法がおわかりになるのであれば、これ自体を「時・分・秒」に直してしまって表示したほうがシンプルになるのではないかな?と思いました。

残り「時間」 = (残り秒数÷3600)の整数部分
残り「 分 」 = ((残り秒数-(残り「時間」× 3600))÷ 60))の整数部分
残り「 秒 」 = 残り秒数-(残り「時間」× 3600)-(残り「 分 」× 60)

で変換できることと思います。ご検討を。

Qdate型でのbetweenについて教えてください。

皆様、新年明けましておめでとうございます。

早速ですが、date型でのbetweenについて教えてください。

SQL文
SELECT * FROM test WHERE date between date '2007-12-01' and date '2007-12-31'

を発行すると、2007-12-31のレコードがあるのに該当しません・・・

試しにSQL文を
SELECT * FROM test WHERE date between date '2007-12-01 00:00:00' and date '2007-12-31 23:59:59'
としても2007-12-31のレコードは検索されません・・・
SQL文を
SELECT * FROM test WHERE date between date '2007-12-01' and date '2008-01-01'
にすると2007-12-31が該当するのですが、
SELECT * FROM test WHERE date between date '2007-12-01' and date '2007-12-31'
では2007-12-31のレコードは該当しないものでしょうか??

select * from test where num between 10 and 100
とした場合では、num が 10 ~ 100 のものが問い合わされますよね??
date型になるとこうならないのでしょうか??

よろしくお願いします。

皆様、新年明けましておめでとうございます。

早速ですが、date型でのbetweenについて教えてください。

SQL文
SELECT * FROM test WHERE date between date '2007-12-01' and date '2007-12-31'

を発行すると、2007-12-31のレコードがあるのに該当しません・・・

試しにSQL文を
SELECT * FROM test WHERE date between date '2007-12-01 00:00:00' and date '2007-12-31 23:59:59'
としても2007-12-31のレコードは検索されません・・・
SQL文を
SELECT * FROM test WHERE date between date...続きを読む

Aベストアンサー

No.1です。
列の属性をtimestampにして実行してみました。

Welcome to psql 8.2.0, the PostgreSQL interactive terminal.
farm=# create table testtbl6 (hoge timestamp);
CREATE TABLE
farm=# insert into testtbl6 values('2007-12-31');
INSERT 0 1
farm=# select * from testtbl6;
hoge
---------------------
2007-12-31 00:00:00
(1 row)

farm=# select * from testtbl6 where hoge between '2007-01-01' and '2007-12-31';
hoge
---------------------
2007-12-31 00:00:00
(1 row)

farm=# select * from testtbl6 where hoge between date '2007-01-01' and date '2007-12-31';
hoge
---------------------
2007-12-31 00:00:00
(1 row)

●時間だけを多少進めたデータを追加してみました

farm=# insert into testtbl6 values('2007-12-31 01:00:00');
INSERT 0 1
farm=# select * from testtbl6;
hoge
---------------------
2007-12-31 00:00:00
2007-12-31 01:00:00
(2 rows)

farm=# select * from testtbl6 where hoge between '2007-01-01' and '2007-12-31';
hoge
---------------------
2007-12-31 00:00:00
(1 row)

farm=# select * from testtbl6 where hoge between date '2007-01-01' and date '200
7-12-31';
hoge
---------------------
2007-12-31 00:00:00
(1 row)

よって、あなたのDBに登録してあるデータは、2007-12-31と午前0時を少し回っているデータが登録されているため、
検索でヒットしないのではないのでしょうか?

No.1です。
列の属性をtimestampにして実行してみました。

Welcome to psql 8.2.0, the PostgreSQL interactive terminal.
farm=# create table testtbl6 (hoge timestamp);
CREATE TABLE
farm=# insert into testtbl6 values('2007-12-31');
INSERT 0 1
farm=# select * from testtbl6;
hoge
---------------------
2007-12-31 00:00:00
(1 row)

farm=# select * from testtbl6 where hoge between '2007-01-01' and '2007-12-31';
hoge
---------------------
2007-12-31 ...続きを読む

Qleft join が3つ以上のとき

例えば

select * from
((t1 left join t2 on t1.a=t2.a)left join t3 on t1.a=t3.a)
where b.t1='y';

という風にカッコがついて記入しにくくなります。
4つの場合はさらに深刻です。
簡単な記法はないのでしょうか?

Aベストアンサー

今回の例では、元々括弧を使う必要はないので、不必要な括弧を書かないようにすればいいのでは?

また、クエリを部分的にビューにしてしまえば、SQLは簡潔にできます。

Qテーブルからのselectにおいてデータの有無により結果をわけたい

id | point
----+-------
1 | 10
2 | 9
3 | 5
....
というテーブルがあるとします.
idを指定してpointを得たいのですが、そのidがこのテーブルに存在しない場合は空の結果ではなく0を返したいのです.
plpgsqlなどを使いif文で場合分けすればできることはわかっているのですがSQL文だけで(それもできれば1文で)これを実現する方法はあるでしょうか?
よろしくお願い致します。

Aベストアンサー

変則的ですが、これでよければidがユニークでなくても大丈夫ですし、集合関数を使わなくてもOKです。

select dm.id,case when ex1.point is null then 0 else ex1.point end from
(select ? as id) as dm left join ex1 on dm.id = ex1.id;

?を適当に変えてください。
chukenkenkouさんの発想はこれですよね。

Qequalsの逆

javaで、文字列の場合は比較演算子の「==」は用いずに

if ((str1.getText()).equals(str2)){
(※…str1,2は文字列)

と書きますよね?
この逆で、文字列str1とstr2は等しくないとき、にはif以下の条件文をどのように書けばよいでしょうか?

Aベストアンサー

>if !((str1.getText()).equals(str2)){

あくまで
if(){
}


!(str1.getText()).equals(str2)
が入っているので
if !((str1.getText()).equals(str2)){
じゃなくて
if (!(str1.getText()).equals(str2)){
こう。


人気Q&Aランキング

おすすめ情報