2

customerIDOpenOffice Base (HyperSQL) を使用してデータ変換を行っており、競合を解決するために最初の 3 文字、次に 3 桁に基づいてフィールドを生成したいと考えています。

最初の 3 文字を取得するのに問題はありません。

CustomerID Customer_Name
AAA AAA サービス
バス事業 R US
NOR ノーザンエクスポージャー
NOR ノース フェイス
NOR ノースショア供給
ZEB ゼブラ塗装

そして、私はこれを取得したいと思います:

CustomerID Customer_Name
AAA001 AAA サービス
BUS001 ビジネス R 米国
NOR001 ノーザンエクスポージャー
NOR002 ノースフェイス
NOR003 ノースショアサプライ
ZEB001 ゼブラ塗装

HyperSQL がサポートされている場合、これは簡単に実現できることがわかりますが、そうrow_number()ではないようです。

他のエレガントなソリューションはありますか?

4

3 に答える 3

1

HyperSQL 2.2.8 はROWNUM()をサポートします。このバージョンを外部データベースとして使用できます。このリンクを参照してください http://hsqldb.org/web/openoffice.html

OpenOffice に含まれている HSQLDB 1.8.0 では、複数の手順でこれを行うことができます (最初の 3 文字で列を作成した後)。

UPDATE CUSTOMER SET "CustomerID" = "CustomerID" || '001' 
  WHERE "Customer_Name" IN (
    SELECT MIN("Customer_Name") 
      FROM CUSTOMERS WHERE CHAR_LENGTH("CustomerID") = 3
      GROUP BY "CustomerID"
    )

次に、「002」、「003」などで繰り返します。

于 2012-06-20T17:00:16.263 に答える
0

基本的に、あなたが求めているのは、グループごとのランクを持つことです (あなたの場合、手探りは ごとCustomerIDです)。@fredtが言ったPARTITION BYように(MSSQLの下にあるような)HSQLDBサポートはありませんが、次のことができます(自動生成された数値IDを文字列の先頭に追加する場合は大したことではありません)

Select ID, CustomerID, Customer_Name,
     (Select 1 + Count(*) From Customers
      Where CustomerID = A.CustomerID
         And Id < A.Id) Rank
 From Customers A 

ランク列には、グループごとの行数が表示されます

于 2013-10-11T13:09:46.277 に答える