17

私はこのように見えるビューを持っています

          value1count     value2count value3count
          ----------------------------------------
             25              35          55

列ヘッダーを行に転置する必要があるため、次のように表示する必要があります

          Values              Count
         -----------------------------
           value1count         25
           value2count         35
           value3count         55

これを行うには、最初の列として個々の列名を選択し、2番目の列としてデータを選択してから、すべての列に対して同じものを結合します。

これを行うためのより良い方法はありますか?PosgreSQL 8.1を使用しているため、使用するピボット演算子がありません。

よろしくお願いします。

4

5 に答える 5

41

Crosstabは必要なものの逆を行うだけですが、これは次のことに役立ちます。

まずunnest()、8.4に含まれている関数を作成します。手順については、こちらを参照してください。

次に、これを行うことができます(この投稿に基づく):

SELECT
   unnest(array['value1Count', 'value2Count', 'value3Count']) AS "Values",
   unnest(array[value1Count, value2Count, value3Count]) AS "Count"
FROM view_name
ORDER BY "Values"

これが8.4で機能することは確認できますが、8.1がないため、同じように機能することを約束することはできません。

于 2012-05-16T19:24:10.283 に答える
8

私はの機能を使用してあなたの目標を達成しましたhstore

SELECT (x).key, (x).value
FROM
  ( SELECT EACH(hstore(t)) as x
    FROM   t
  ) q;

「分解される」ビューまたはテーブル(ここではt)に複数の行がある場合、中間テーブルに追加の識別子を挿入する必要がある場合がありますq。次に例を示します。

SELECT id, (x).key, (x).value
FROM
  ( SELECT id, EACH(hstore(t)) as x
    FROM   t
  ) q;

参照:hstoreドキュメント

于 2014-01-15T09:01:11.813 に答える
5

私は、bashスクリプトからのテーブル情報をより簡単に処理するために、これに似た何かをしようとしていました。テーブルの列を行として表示するようにpsqlに指示するのは非常に簡単であることがわかります。

psql mydbname -x -A -F= -c "select * from blah where id=123"
  • これ-xが出力をピボットするものです。
  • -A余分な間隔を削除します。
  • 列名と値の間で置き換え-F=られ|ます。=

もちろん、これはSQLでは機能せず、psql出力のフォーマット方法を変更するだけです。

于 2016-03-16T18:52:35.120 に答える
1

私も同じような状況でした。クエリをwithステートメントでラップしてから、UNION ALL各行に対して一連のsを実行しました。私の状況では、複数のレコードがある場合、ncm_idは異なるため、先に進み、それを結果セットの列リストに追加しました。これはこれを行うための最良の方法ではないかもしれませんが、私のユースケースでは機能しました。

 WITH query_a AS (
     SELECT
       fin_item.item_number || ' - ' || fin_item.item_descrip1 fin_item,
       fin_ls.ls_number,
       ls_sort.sortby_employeeid,
       ls_sort.ncm_id,
       ls_sort.created_at,
       ls_sort.updated_at,
       ls_sort.sort_qty,
       ls_sort.initial_scan_time,
       ls_sort.ncm_scan_time,
       ls_sort.badge_scan_time,
       ls_sort.computer_name,
       ls_sort.number_of_ops,
       ls_sort.ncm_item_scan_time,
       sort_by.name sort_by,
       tblncm.instructions,
       tblncm.ncm_comments
     FROM public.item AS fin_item
       INNER JOIN public.ls AS fin_ls ON fin_item.item_id = fin_ls.ls_item_id
       INNER JOIN stone.ls_sort ON fin_ls.ls_id = ls_sort.ls_id
       INNER JOIN stone.vw_mssql_employees AS sort_by ON ls_sort.sortby_employeeid = sort_by.employeeid
       INNER JOIN stone.tblncm ON ls_sort.ncm_id = tblncm.ncm_id
       LEFT JOIN stone.equips AS mach_equips ON ls_sort.mach_equip_id = mach_equips.id
       LEFT JOIN stone.equips AS mold_equips ON ls_sort.mold_equip_id = mold_equips.id
     WHERE 1 = 1
           AND fin_ls.ls_number ILIKE 'S143027526190' || '%'
 )
   SELECT *
   FROM (
     (SELECT 'fin_item' my_column, fin_item::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a)
      UNION ALL
     (SELECT 'ls_number' my_column, ls_number::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a)
      UNION ALL
     (SELECT 'sortby_employeeid' my_column, sortby_employeeid::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a)
      UNION ALL
     (SELECT 'ncm_id' my_column, ncm_id::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a)
      UNION ALL
     (SELECT 'created_at' my_column, created_at::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a)
      UNION ALL
     (SELECT 'updated_at' my_column, updated_at::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a)
      UNION ALL
     (SELECT 'sort_qty' my_column, sort_qty::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a)
      UNION ALL
     (SELECT 'initial_scan_time' my_column, initial_scan_time::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a)
      UNION ALL
     (SELECT 'ncm_scan_time' my_column, ncm_scan_time::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a)
      UNION ALL
     (SELECT 'badge_scan_time' my_column, badge_scan_time::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a)
      UNION ALL
     (SELECT 'computer_name' my_column, computer_name::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a)
      UNION ALL
     (SELECT 'number_of_ops' my_column, number_of_ops::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a)
      UNION ALL
     (SELECT 'ncm_item_scan_time' my_column, ncm_item_scan_time::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a)
      UNION ALL
     (SELECT 'sort_by' my_column, sort_by::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a)
      UNION ALL
     (SELECT 'instructions' my_column, instructions::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a)
      UNION ALL
     (SELECT 'ncm_comments' my_column, ncm_comments::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a)
   ) as query_guy
 ORDER BY my_ncm;
于 2017-11-21T18:39:32.530 に答える
0

理解できませんでした...しかし、これを行う方法は、DISTINCTを選択してから、必要な平均列値を選択することでした。このような:

SELECT DISTINCT contributing_factor_vehicle_1, AVG(number_of_cyclist_injured) FROM "table1".motor_vehicle_collisions_crashes 
GROUP BY contributing_factor_vehicle_1
ORDER BY avg(number_of_cyclist_injured) desc

それがそのようなものを作成したものです: ここに画像の説明を入力してください

これはNYCの自動車事故データでした。

于 2020-02-26T19:25:51.553 に答える