私はSSRSで使用できるように、MS-Accessクエリをpostgresステートメントに変換しようとしています。 IIFの声明を除いて素晴らしい仕事をしているようだ。postgresのIIF
SELECT labor_sort_1.ncm_id
,IIf(labor_sort_1.sortby_employeeid = 3721
, ((labor_sort_1.MaxUpdatedAt - labor_sort_1.MinNCMScanTime) * 24 * 29 * labor_sort_1.number_of_ops)
, IIf(labor_sort_1.sortby_employeeid = 3722
, ((labor_sort_1.MaxUpdatedAt - labor_sort_1.MinNCMScanTime) * 24 * 24 * labor_sort_1.number_of_ops)
, IIf(labor_sort_1.sortby_employeeid = 3755, ((labor_sort_1.MaxUpdatedAt - labor_sort_1.MinNCMScanTime) * 24 * 24 * labor_sort_1.number_of_ops)
, ((labor_sort_1.MaxUpdatedAt - labor_sort_1.MinNCMScanTime) * 24 * 17 * labor_sort_1.number_of_ops)))) AS labor_cost
FROM
(SELECT
ls_sort.ncm_id
, ls_sort.computer_name
, ls_sort.number_of_ops
, ls_sort.badge_scan_time
, ls_sort.sortby_employeeid
, Min(ls_sort.ncm_scan_time) AS MinNCMScanTime
, Max(ls_sort.updated_at) AS MaxUpdatedAt
FROM stone.ls_sort
INNER JOIN stone.ls ON ls_sort.ls_id = ls.ls_id
WHERE 1=1
AND ls_sort.created_at Between current_date-1 And current_date
GROUP BY ls_sort.ncm_id
, ls_sort.computer_name
, ls_sort.number_of_ops
, ls_sort.badge_scan_time
, ls_sort.sortby_employeeid
ORDER BY ls_sort.computer_name) AS labor_sort_1
それは function iif(boolean, interval, interval) does not exist
がどのように私はこの問題を解決する、次のメッセージを返しますか?
驚くべき示唆+ 1が答えとしてマークされています。 Postgresに関数pg_tempを作成し、msアクセスのiifと同じように動作する方法はありますか? (私の上司のために) –
私はそれが可能であるかどうかを言うためにpostgres関数には十分に精通していません。私はそうするだろうと思うが、私は2つの理由でそれをやることは避けるだろう:1)iif()はRDBMSにとって奇妙なものである。太陽の下のすべてのRDBMSはCASEを使用します。 SQLをより標準化するために、CASEに切り替えることは良い考えです。 2)私は、UDFがCASEとしてRDBMSロジックに深く定着しているものよりも遅くなることを賭けている。 – JNevill
ありがとうございました。私はいくつか微調整を行い、現在は生産中です。 –