1

PostgreSQL Unicode 9.01 が気に入らない点:

SELECT table1.fielda,
SUM (CAST (table2.fielda AS INT)) AS header.specific
FROM *etc*

SUM-CAST の何が問題になっていますか?

エラーメッセージ:

不適切な列式: 'SUM (CAST (specifics_nfl_3pl_work_order_item.delivery_quantity AS INT))

クエリ:

SELECT specifics_nfl_3pl_work_order.work_order_number,
specifics_nfl_3pl_work_order.goods_issue_date,
specifics_nfl_3pl_work_order.order_status_id,
SUM (CAST (specifics_nfl_3pl_work_order_item.delivery_quantity AS INT)) AS units
FROM public.specifics_nfl_3pl_work_order specifics_nfl_3pl_work_order,
public.specifics_nfl_3pl_work_order_item specifics_nfl_3pl_work_order_item,
public.specifics_nfl_order_status specifics_nfl_order_status
WHERE specifics_nfl_3pl_work_order.order_status_id In (3,17,14) 
AND specifics_nfl_3pl_work_order_item.specifics_nfl_work_order_id=
specifics_nfl_3pl_work_order.id 
AND ((specifics_nfl_3pl_work_order.sold_to_id<>'0000000000') 
AND (specifics_nfl_3pl_work_order.goods_issue_date>={d '2013-08-01'}))

お役に立てれば本当に助かります。

4

3 に答える 3

2

私があなたなら、次の手順を実行します。

  • テーブルに短いエイリアスを付けます
  • クエリをフォーマットする
  • 適切な ANSI 結合を使用します。
  • 関数名と ( の間のスペースを削除します。

select
    o.work_order_number,
    o.goods_issue_date,
    o.order_status_id,
    sum(cast(oi.delivery_quantity as int)) as units
from public.specifics_nfl_3pl_work_order as o
    inner join public.specifics_nfl_3pl_work_order_item as oi on
       oi.specifics_nfl_work_order_id = o.id
    -- inner join public.specifics_nfl_order_status os -- seems redundant
where
    o.order_status_id In (3,17,14) and
    o.sold_to_id <> '0000000000' and
    o.goods_issue_date >= {d '2013-08-01'}

実際、ここでgroup by句が必要だと本当に思います:

select
    o.work_order_number,
    o.goods_issue_date,
    o.order_status_id,
    sum(cast(oi.delivery_quantity as int)) as units
from public.specifics_nfl_3pl_work_order as o
    inner join public.specifics_nfl_3pl_work_order_item as oi on
       oi.specifics_nfl_work_order_id = o.id
where
    o.order_status_id In (3,17,14) and
    o.sold_to_id <> '0000000000' and
    o.goods_issue_date >= {d '2013-08-01'}
group by
    o.work_order_number,
    o.goods_issue_date,
    o.order_status_id

それでも機能しない場合は、sum にコメントしてみて、機能しているかどうかを確認してください。

于 2013-08-11T09:02:39.290 に答える
0

@Roman がすでに解決したことに加えて、ここにはさらに問題があります。

SELECT o.work_order_number
      ,o.goods_issue_date
      ,o.order_status_id
      ,SUM(CAST(oi.delivery_quantity AS INT)) AS units -- suspicious
FROM   public.specifics_nfl_3pl_work_order o,
JOIN   public.specifics_nfl_3pl_work_order_item oi
                                     ON oi.specifics_nfl_work_order_id = o.id 
CROSS  JOIN public.specifics_nfl_order_status os -- probably wrong
WHERE  o.order_status_id IN (3,17,14)
AND    o.sold_to_id <> '0000000000'              -- suspicious
AND    o.goods_issue_date> = {d '2013-08-01'}    -- nonsense
GROUP  BY 1, 2, 3
  • o.goods_issue_date> = {d '2013-08-01'}構文上のナンセンスです。多分あなたは意味します:
    o.goods_issue_date> = '2013-08-01'

  • リストにテーブルspecifics_nfl_order_statusがありますFROMが、それを残りのテーブルに接続する式はありません。これは事実上CROSS JOIN、デカルト積をもたらし、非常に高価な方法でほぼ間違いなく間違っています: すべての行が残りのすべての行と結合されます:
    CROSS JOIN public.specifics_nfl_order_status os
    テーブルを削除する (使用しないため) または追加するWHEREまたはONそれを残りに接続する句。単なる冗長ではなく、そのままでも結果に劇的な影響を与えることに注意してください。

  • このWHERE句は疑わしい:
    AND o.sold_to_id <> '0000000000'
    数値を文字列として保存しているか、2 つを混同しているようです。また、最初はCAST (oi.delivery_quantity AS INT) 必要ありません。列は、データ型integerまたはその他の適切な数値型である必要があります。必ず適切なデータ型を使用してください。

  • のデフォルト設定にはsearch_pathincludesが含まれてpublicおり、テーブルをスキーマ修飾する必要がない場合があります。の代わりにpublic.specifics_nfl_3pl_work_order、次を使用するだけで十分な場合があります。
    specifics_nfl_3pl_work_order

  • GROUP BY 1, 2, 3位置パラメーターを使用しています。これは、次の表記上のショートカットです。
    GROUP BY o.work_order_number, o.goods_issue_date, o.order_status_id
    詳細はマニュアルを参照してください。

  • MS Queryクエリの作成に使用しているコメントによると。これは最善のアイデアではありません。あなたが私たちに提示した種類の劣ったコードを生成します。PostgreSQL を使用している間は、それを取り除きたいと思うかもしれません。

于 2013-08-11T12:15:54.743 に答える