2016-09-02 2 views
-1

プリンタの印刷量を毎日取得するクエリを書きましたが、エラー1241:オペランドには1列が含まれています。私はすでに検索し、ここでいくつかの答えを見つけましたが、それは役に立たなかった。SQLのエラー - クエリ

これは私のコードです:

select 
      (select insertDate,snmpValue,Hostname 
      from TBL_counterHistory 
      inner join TBL_printer 
      on TBL_counterHistory.fk_tbl_printer = TBL_printer.pk_id 
      where Hostname = 'ASEPT-OP' 
      and date(insertDate) = date(date_sub(now(),interval 0 day))) 
      - 
      (select insertDate,snmpValue,Hostname 
      from TBL_counterHistory 
      inner join TBL_printer 
      on TBL_counterHistory.fk_tbl_printer = TBL_printer.pk_id 
      where Hostname = 'ASEPT-OP' 
      and date(insertDate) = date(date_sub(now(),interval 1 day))) 
from dual; 

私が間違っているものを、知っている `tを:(

+1

サブ選択は一つだけの行と列 '-'を返すことがあります。 – jarlh

+0

除算演算子( - )は2つの数値を取りますが、サブクエリにはより多くの数値が含まれています。また、これはあなたが望むものを達成するための非常に異なる方法です。 group byとsumの使用を検索します。デュアルからの – Doruk

+1

?あなたはmysqlを使用していることを確認していますか? – Jens

答えて

0

私はあなたのクエリから正確に正確なスキーマを伝えることはできませんが、これは過度に複雑に見えます。それはより多くのようにすべきではありません:

select count(hist.*) as prints 
from TBL_counterHistory hist 
inner join TBL_printer prn 
on hist.fk_tbl_printer = prn.pk_id 
where prn.Hostname ='ASEPT-OP' and 
hist.insertDate >= date_sub(now(), interval 1 day) and 
hist.insertDate <= now() 

(必要に応じて、あなたが行ったように明らかに日付()関数で日付のクリッピングを調整)

特に、整数データのみを気にする場合は、すべての副選択の必要性はありません。これは2つではなく1つのクエリです。加えて、あなたは単なる列の副選択で数学を行うことができます(論理演算子はここでは面白いです)。

0

私は、Oracleデータベースを使用していると仮定しています(なぜなら、あなたの質問に二重テーブルを使用しているからです)。その後

、おそらくあなたはLAG

select insertDate, SUM(snmpValue) - LAG(SUM(snmpValue), 1, 0) OVER (ORDER BY insertDate), Hostname 
      from TBL_counterHistory 
      inner join TBL_printer 
      on TBL_counterHistory.fk_tbl_printer = TBL_printer.pk_id 
      where Hostname = 'ASEPT-OP' GROUP BY insertDate,Hostname; 

のような解析関数を探すことができますのでご注意ください。私はこれを試していません。あなたが提供したスクリプトによって

+0

これは私に印刷物の全量を示しています。例えば、2日前には5050、昨日は5100、今日は5120などです。しかし、私は減算を得たいと思っていました。この例では50と20です。 –

0

私はあなたのデータベーススキーマはこの1つに似に見えると仮定しています:

Database schema

あなたのサブ選択の結果は次のようになります。

+------------+-----------+----------+ 
| insertDate | snmpValue | Hostname | 
+------------+-----------+----------+ 
| 2016-09-02 |  5312 | ASEPT-OP | 
+------------+-----------+----------+ 

問題あなたが複数の列を減算しようとしているということです。それがエラーの内容です。サブ選択では、印刷枚数を含む列を1つだけ選択する必要があります。

あなたのSQLクエリは次のように修正することができます。

select 
      (select snmpValue 
      from TBL_counterHistory 
      inner join TBL_printer 
      on TBL_counterHistory.fk_tbl_printer = TBL_printer.pk_id 
      where Hostname = 'ASEPT-OP' 
      and date(insertDate) = date(date_sub(now(),interval 0 day))) 
      - 
      (select snmpValue 
      from TBL_counterHistory 
      inner join TBL_printer 
      on TBL_counterHistory.fk_tbl_printer = TBL_printer.pk_id 
      where Hostname = 'ASEPT-OP' 
      and date(insertDate) = date(date_sub(now(),interval 1 day))) 
from dual;