1. ホーム
  2. データベース
  3. ポストグレスキュー

Postgresqlの高度なアプリケーションは、セルのアイデアをマージするの詳細

2022-01-10 11:03:14

1. 前に書く✍」。

前回の記事に続き postgresql 高度な行から列への適用と要約のまとめ もう一歩踏み込んで、もっと複雑なことをやってみたい(チャートはとりあえず置いといて ? もちろん、レポートとして、一番多いのはセルの結合です、はい、待ち遠しいです ? ~

2. 考える

まず、フロントエンドの説明を頭の中に入れておきます。 table もちろん、これはフロントエンド以外の学生には非常に不親切なので、もしあなたが以下を読もうとして困っているなら(フロントエンドの html , , および javascript ) はここで止めることができます。
enn... フロントエンドを少し説明します。 html 表形式の?

2.1 フロントエンド html -> table 基本構造

まず、非常に基本的なhtmlを与えてみましょう。

demo.html
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8" />
	<title>demo</title>
</head>
<body>
  <! -- This defines two attributes border:defines the table border cellpadding:defines the cell size -->
  <table border="3" cellpadding="8">
	<thead>
		<tr>
			<th>tablehead1</th><th>tablehead2</th><th>tablehead3</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>1st row 1st</td><td>1st row 2nd</td><td>1st row 3rd</td>
		</tr>
		<tr>
			<! -- Use the colspan attribute for horizontal merging, the position of the horizontal merged cell needs to be freed up -->
			<! -- The following horizontal merging of two cells, so the second td tag should not be written, otherwise it will overflow Oh ~ -->
			<td colspan="2"> horizontally merged two cells </td><td> second line 3rd </td>
		</tr>
		<tr>
			<td>3rd row 1st</td><td>3rd row 2nd</td><td>3rd row 3rd</td>
		</tr>
		<tr>
			<! -- Vertical merge using the rowspan attribute, the (spanned) cell position of the vertical merge needs to be freed up -->
			<! -- The following vertical merge three cells (in the last tab of this line), so the last two td tabs of the next two lines should not be written ~, otherwise the same will overflow Oh ~ -->
			<td>4th row 1st</td><td>4th row 2nd</td><td rowspan="3">Vertically merged three cells</td>
		</tr>
		<tr>
			<td>5th row 1st</td><td>5th row 2nd</td>
		</tr>
		<tr>
			<td>6th row 1st</td><td>6th row 2nd</td>
		</tr>
	</tbody>
  </table>
</body>
</html>

colspan

ブラウザでレンダリングすると(ブラウザでhtmlファイルを開くと)こんな感じになります~。

上記の要約は rowspan のセルを水平方向にマージしている。 html 垂直方向のセル結合を実現する〜。

さて、これで case 2つの属性値(つまり、マージされた行数またはマージされた列数)は、この2つのパラメータをsqlで生成し、それをフロントエンドの学生に提供して使用させるために必要なものです。これは浅い意味ですが、では深い意味は何でしょうか? /この2つのパラメータをsqlで生成し、それをフロントエンドの学生に提供することがまず必要です。

  • セルの水平方向の結合の場合

を使用する必要があります。 when + then + sql この節では水平方向のマージが必要かどうかを判断していると考えるのが妥当であり(水平方向のマージの値を与えることが重要)、そうすることで起こりうるトラブルとしては aggregation もちろん最終手段として)冗長になりますが、もちろんこのセクションでは水平マージのセルについては話しません

  • 垂直方向のセル結合の場合

ステップ1 .???? を使用する場合 Window function + rowspan を使用して、マージする必要があるカラムの数を同じだけ計算するため、生成された step1 同じ列の場合、値は同じになります(下図参照)。

ステップ2 . ???? .... を渡すことができますので backwards sequence を使用して、ウィンドウ内の値の合計を生成することも可能である。 order by 列、ハハ? は、マージされた数値の1列目です。.ビンゴ
ウィンドウのカラムは逆順にソートされています

合計列数+反転列数

ステップ3 .???? 1 つのデータ列のマージを行うことができるので、2 つの列のマージも行うことができます (これは副列にもなり得ます、注意してください。 drop table if EXISTS report2 ; CREATE TABLE report2 ( "id" varchar(10) primary key, "name" varchar(50), "price" numeric, "level2" varchar(50) , "level1" varchar(50) ); (マージされた行の影響ああ)、ここで単にマージされた値の列の生成を包装の層の後にそれぞれ、ああ、次の図の緑の部分に注意してください?

テストスクリプトで試してみてください。~

2.2 テーブル構造

INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0015 ', 'shampoo', '36', 'care', 'daily use');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0008 ', 'soap', '17.5', 'toiletries', 'daily necessities');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0007 ', 'fries', '7.5', 'junk food', 'snacks');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0009 ', 'instant noodles', '3.5', 'junk food', 'snacks');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0004 ', 'spicy sticks', '5.6', 'junk food', 'snacks');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0006 ', 'iPhone X', '9600', 'small appliance', 'appliance');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0003 ', 'watches', '1237.55', 'small appliances', 'appliances');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0012 ', 'TV', '3299', 'big appliances', 'appliances');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0016 ', 'washing machine', '4999', 'large appliance', 'appliance');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0013 ', 'scarves', '93', 'accessories', 'clothing accessories');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0017 ', 'Tebow Sandals', '499', 'Shoes', 'Clothing Accessories');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0001 ', 'NIKE new shoes', '900', 'shoes', 'clothing accessories');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0002 ', 'jacket', '110.9', 'top', 'clothing accessory');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0014 ', 'workbook', '1', 'paper', 'stationery');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0005 ', 'pencils', '7', 'pens', 'stationery');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0010 ', 'mugs', '27', 'catering', 'daily necessities');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0011 ', 'towels', '15', 'toiletries', 'daily necessities');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0018 ', 'drawing pen', '15', 'pen', 'stationery');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0019 ', 'soda', '3.5', 'other', 'snacks');

2.3 テーブルフィールドのコメント

<テーブル フィールド コメント イド 主キー 名前 製品名 価格 価格 レベル2 二次分類 レベル1 第一階層分類

2.4 テーブルデータ

select 
  t1.*,
  case when t_rank=t_count then t_count else null end as level1_row,
  case when tu_rank=tu_count then tu_count else null end as level2_row
from 
(
    select 
      *,
      row_number() over (PARTITION by level1 order by level1 asc) t_rank,
      count(1) over (PARTITION by level1) t_count,
      row_number() over(PARTITION by level1,level2 order by level1,level2 asc) tu_rank,
      count(1) over (PARTITION by level1,level2) tu_count
    from report2 order by level1
) t1 order by t1.level1,t_rank desc,t_count desc,tu_rank desc,tu_count desc;

3. ???? 結果セット 最終解答

sql

の赤い部分は、フロントエンドの子供たちに必要なマージ値 ? ~

上記の問題を読み、解答することができれば sql , またバージョンアップおめでとうございます ? /{コード