PostgreSQL 两组隔离但不只按零价格列排序

PostgreSQL two groups segregated but not ordered only by zero price column

我需要一些疯狂的单一查询目标的帮助,我不确定 GROUP BY 或 sub-SELECT 是否适用于?

以下查询:

SELECT id_finish, description, inside_rate, outside_material, id_part, id_metal
FROM parts_finishing AS pf 
LEFT JOIN parts_finishing_descriptions AS fd ON (pf.id_description=fd.id);

Returns 结果如下:

+-------------+-------------+------------------+--------------------------------+
| description | inside_rate | outside_material | id_part - id_finish - id_metal |
+-------------+-------------+------------------+--------------------------------+
| Nickle      | 0           | 33.44            | 4444-44-44, 5555-55-55         |
+-------------+-------------+------------------+--------------------------------+
| Bend        | 11.22       | 0                | 1111-11-11                     |
+-------------+-------------+------------------+--------------------------------+
| Pack        | 22.33       | 0                | 2222-22-22, 3333-33-33         |
+-------------+-------------+------------------+--------------------------------+
| Zinc        | 0           | 44.55            | 6000-66-66                     |
+-------------+-------------+------------------+--------------------------------+

我需要以下格式的结果 return,但有问题:

  1. 我需要按 inside_rate outside_material ORDER BY description 列但 不是 ORDER BY 或按价格排序(inside_rateoutside_material 是价格)。所以我们知道,如果 inside_rate 为 0,则它们属于一个组;如果 outside_material 为 0,则它们属于另一个组。

  2. 我需要 ORDER BY descriptiondesc 在每个组 returned 之后。

  3. 我需要 return 那个inside/outside组/那个整理的价格的零件清单(由三个单独的列组成)。

堆栈格式修复。

+-------------+-------------+------------------+--------------------------------+
| description | inside_rate | outside_material | id_part - id_finish - id_metal |
+-------------+-------------+------------------+--------------------------------+
| Bend        | 11.22       | 0                | 1111-11-11                     |
+-------------+-------------+------------------+--------------------------------+
| Pack        | 22.33       | 0                | 2222-22-22, 3333-33-33         |
+-------------+-------------+------------------+--------------------------------+
| Nickle      | 0           | 33.44            | 4444-44-44, 5555-55-55         |
+-------------+-------------+------------------+--------------------------------+
| Zinc        | 0           | 44.55            | 6000-66-66                     |
+-------------+-------------+------------------+--------------------------------+

我正在使用的 table 及其数据类型:

                              Table "public.parts_finishing"
      Column      |  Type   |                          Modifiers
------------------+---------+-------------------------------------------------------------
 id               | bigint  | not null default nextval('parts_finishing_id_seq'::regclass)
 id_part          | bigint  |
 id_finish        | bigint  |
 id_metal         | bigint  |
 id_description   | bigint  |
 date             | date    |
 inside_hours_k   | numeric |
 inside_rate      | numeric |
 outside_material | numeric |
 sort             | integer |
Indexes:
    "parts_finishing_pkey" PRIMARY KEY, btree (id)


                           Table "public.parts_finishing_descriptions"
  Column    |  Type   |                                 Modifiers
------------+---------+------------------------------------------------------------------
id not null | bigint  | default nextval('parts_finishing_descriptions_id_seq'::regclass)
date        | date    |
description | text    |
rate_hour   | numeric |
type        | text    |
Indexes:
    "parts_finishing_descriptions_pkey" PRIMARY KEY, btree (id)

第二个table的第一列是只是id。 (为什么我们在 2015 年仍然处理 1024 静态宽度布局?)

我会制作一个 SQL fiddle 尽管它拒绝为我加载,无论浏览器如何。

不完全确定我理解你的问题。可能看起来像这样:

SELECT pd.description, pf.inside_rate, pf.outside_material
     , concat_ws(' - ', pf.id_part::text
                      , pf.id_finish::text
                      , pf.id_metal::text) AS id_part_finish_metal
FROM   parts_finishing pf 
LEFT   JOIN parts_finishing_descriptions fd ON pf.id_description = fd.id
ORDER  BY (pf.inside_rate = 0)         -- 1. sorts group "inside_rate" first
     , pd.description DESC NULLS LAST  -- 2. possible NULL values last
;