3

こんにちは、SQL で group by 句を使用する方法を知っています。これを説明する方法がわからないので、いくつかの図を描きます。これが私の元のデータです:

Name          Location
----------------------
user1         1
user1         9
user1         3
user2         1
user2         10
user3         97

ここに私が必要とする出力があります

Name          Location
----------------------
user1         1
              9
              3
user2         1
              10
user3         97

これは可能ですか?

4

7 に答える 7

4

これの通常の方法は、データベース層ではなく、プレゼンテーション層で処理することです。

理由:

  • Nameフィールドはそのデータ行のプロパティです
  • 省略した場合、何がどの名前に当てはまるNameかをどのように知ることができますか?Location
  • データの順序に暗黙的に依存していますが、これは SQL では非常に悪い習慣です (返されるデータには固有の順序がないため)。
  • どのソリューションでもカーソルまたはループを使用する必要がありますが、これは SQL の最適化対象ではありません。個々の行ではなく SETS で作業するのが好きです。
于 2012-05-09T19:44:01.443 に答える
3

お役に立てれば


SELECT A.FINAL_NAME, A.LOCATION
  FROM (SELECT DISTINCT DECODE((LAG(YT.NAME, 1) OVER(ORDER BY YT.NAME)),
                               YT.NAME,
                               NULL,
                               YT.NAME) AS FINAL_NAME,
                        YT.NAME,
                        YT.LOCATION
          FROM YOUR_TABLE_7 YT) A

Jirka が正しく指摘したように、私は Outer select の明確で生の Name を不必要に使用していました。私の間違いは、 DISTINCT を使用したときに結果が次のようにソートされたことです


1           1
2   user2   1
3   user3   97
4   user1   1
5           3
6           9
7          10

このような出力は避けたかったのです。

したがって、生のIDと外部選択を追加しました

ただし、DISTINCT を削除すると問題は解決します。だからこれだけで十分


SELECT DECODE((LAG(YT.NAME, 1) OVER(ORDER BY YT.NAME)),
              YT.NAME,
              NULL,
              YT.NAME) AS FINAL_NAME,
       YT.LOCATION
  FROM SO_BUFFER_TABLE_7 YT

ありがとうジルカ

于 2012-05-10T08:03:24.447 に答える
2

レポートを作成するためにそのままの SQL*Plus を使用している場合 (笑わないでください。かなりクールなことができます)、BREAK コマンドを使用してこれを行うことができます。

SQL> break on name
SQL> WITH q AS (
SELECT 'user1' NAME, 1 LOCATION FROM dual
UNION ALL
SELECT 'user1', 9 FROM dual
UNION ALL
SELECT 'user1', 3 FROM dual
UNION ALL
SELECT 'user2', 1 FROM dual
UNION ALL
SELECT 'user2', 10 FROM dual
UNION ALL
SELECT 'user3', 97 FROM dual
)
SELECT NAME,LOCATION
  FROM q
 ORDER BY name;

NAME    LOCATION
----- ----------
user1          1
               9
               3
user2          1
              10
user3         97

6 rows selected.

SQL>
于 2012-05-09T20:02:18.960 に答える
1

SQL * Plusを使用している場合は、BREAK関数を使用してください。この場合、NAMEで中断します。

別のレポートツールを使用している場合は、「名前」フィールドを前のレコードと比較して、同じ場合は印刷を抑制できる場合があります。

于 2012-05-09T20:56:10.353 に答える
1

を使用するGROUP BYと、出力行は GROUP BY 列に従って並べ替えられORDER BY、同じ列に対して があるかのようになります。GROUP BY が生成する並べ替えのオーバーヘッドを回避するには、ORDER BY NULL を追加します。

SELECT a, COUNT(b) FROM test_table GROUP BY a ORDER BY NULL;

MySQL 5.6 で暗黙的な GROUP BY ソートに依存することは非推奨です。グループ化された結果を特定の並べ替え順序で並べ替えるには、明示的な ORDER BY 句を使用することをお勧めします。GROUP BY ソートは MySQL の拡張機能であり、将来のリリースで変更される可能性があります。たとえば、オプティマイザが最も効率的と思われる方法でグループ化を順序付けできるようにし、ソートのオーバーヘッドを回避できるようにします。

完全な情報 - http://academy.comingweek.com/sql-groupby-clause/

于 2016-05-16T05:09:11.020 に答える
1

この種の問題は SQL を使用して解決する必要があるようには見えないという他のコメンテーターには同意せざるを得ませんが、とにかくそれに直面しましょう。

SELECT
    CASE main.name WHERE preceding_id IS NULL THEN main.name ELSE null END,
    main.location
FROM mytable main LEFT JOIN mytable preceding
    ON main.name = preceding.name AND MIN(preceding.id) < main.id
GROUP BY main.id, main.name, main.location, preceding.name
ORDER BY main.id

GROUP BY 句は、少なくとも直接的には、グループ化ジョブには関与しません。最初の概算では、同じテーブルへの外部結合 (以下の LEFT JOIN) を使用して、特定の値が最初に発生する行を特定できます。これが私たちが求めているものです。idこれは、すべてのレコードを任意に並べ替えることができるいくつかの一意の値があることを前提としています。(ORDER BY 句はこれを行いません。計算全体の入力ではなく、出力を順序付けますが、残りの SQL は特定の処理順序を意味しないため、出力が正しく表示されるようにする必要があります。 .)

ご覧のとおり、SQL にはまだ GROUP BY 句がありますが、おそらく予期しない目的があります。その仕事は、LEFT JOIN の副作用を「元に戻す」ことです。これは、多くの「先行する」(= 正常に結合された) レコードを持つすべてのメイン レコードの複製です。

これは GROUP BY ではごく普通のことです。GROUP BY 句の典型的な効果は、レコード数の削減です。また、COUNT、MIN、MAX、または SUM などの集計関数を使用する場合を除き、GROUP BY 句にリストされていない列をクエリまたはテストすることはできません。これは、特定の値だけでなく、GROUP BY により、これらの列が実際に「値のグループ」を表しているためです。

于 2012-05-09T20:06:56.000 に答える