2017-10-04 14 views
0

OracleからSQL Server 2012にインポートされた古いレガシーデータベースを使用しています。私はINSOrdersと呼ばれる以下のテーブルを持っています:OrderIDvarchar(8)の列が含まれています。1つのレコードからのデータの分割は特定の列ですT-SQL

挿入されたデータの例である:

A04-05 | B81-02 | C02-01 
A01-01 | B95-01 | C99-05 
A02-02 | B06-07 | C03-02 
A98-06 | B10-01 | C17-01 
A78-07 | B02-03 | C15-03 
A79-01 | B02-01 | C78-06 

最初の文字= Ordertype、次の2桁=年 - その年以内に、最後の2桁= OrderNum。

だから私は3列にすべてのデータを分割:(ちょうど提示し、保存されていない)

select 
    orderid, 
    substring(orderid, 0, patindex('%[0-9]%', orderid)) as ordtype, 
    right(max(datepart(yyyy, '01/01/' + substring(orderid, patindex('%[0-9]-%', orderid) - 1, 2))),2) as year, 
    max(substring(orderid, patindex('%-[0-9]%', orderid) + 1, 2)) as ordnum 
from 
    ins.insorders 
where 
    orderid is not null 
group by 
    substring(orderid, 0, patindex('%[0-9]%', orderid)), orderid 
order by 
    ordtype 

それはこのように見ている:

OrderID | OrderType | OrderYear | OrderNum 
---------+-------------+-------------+---------- 
A04-05 | A   | 04   | 05 
A01-01 | A   | 01   | 01 
B10-03 | B   | 10   | 03 
B95-01 | B   | 95   | 01 
etc.... 

しかし、今、私はちょうどマックスを選択しますOrderTypeの場合:文字Aの最大値のみを表示し、文字Bの最大値を表示するなど。マックスは、文字AIから最新の年と最新の注文番号を表示する必要があります。だから私はA04 - 01とA04 - 02ちょうどA04 - 02を表示している場合。私は私のクエリを変更する必要が

は、私は以下を参照してくださいすることができました。

OrderID | OrderType | OrderYear | OrderNum 
---------+-------------+-------------+---------- 
A04-05 | A   | 04   | 05 
B10-03 | B   | 10   | 03 
C17-01 | C   | 17   | 01 

私は助けを本当に感謝します、ありがとうございます。

+1

これは一種の奇妙であるので、私は10 'のように表される95' 2010'と ''のように表される ''ためB10-03' OrderYear'が' 10 'の代わりに '95'を示す'に想定'1995?' – Simon

+0

これは、MAX(orderid)を使用してグループからオーダーIDを削除するのと同じくらい簡単ではないでしょうか? –

答えて

1

以下を試すことができます。元のクエリをcteとして使用し、注文年と注文番号に基づいて注文タイプの各グループに行番号を割り当てます。次に、各注文タイプの最大値であるすべての行番号1を取得します。95は1995年と10になるように

この少しDATEPART(yyyy,('01/01/' + OrderYear))は確かに私たちが正しい今年得るようになります2010年であるなど

;WITH cte 
    AS (
    select orderid, 
    substring(orderid, 0, patindex('%[0-9]%', orderid)) as ordtype, 
    right(max(datepart(yyyy,'01/01/' + substring(orderid, patindex('%[0-9]-%', orderid) - 1, 2))),2) as year, 
    max(substring(orderid, patindex('%-[0-9]%', orderid) + 1, 2)) as ordnum 
    from ins.insorders 
    where orderid is not null 
    group by substring(orderid, 0, patindex('%[0-9]%', orderid)), orderid 
    ) 

SELECT * 
FROM 
    (SELECT 
     * 
     , ROW_NUMBER() OVER (PARTITION BY OrderType ORDER BY DATEPART(yyyy,('01/01/' + OrderYear)) DESC, OrderNum DESC) AS RowNum 
    FROM cte) t 
WHERE t.RowNum = 1 
0

データが不十分表され、私は「チーズ」それをする方法を持っている、と我々は仮定の多くを作成する必要がありますされています

with cte_example 
as 
(your query) 
select OrderID 
     ,OrderType 
     ,OrderYear 
     ,OrderNum 
from 
(select *, row_number() over(partition by OrderType order by OrderYear DESC) rn  
from cte_example 
where OrderYear <= right(year(getdate()),2)) t1 
where t1.rn = 1 

すでに情報Iを抽出するクエリを持っているので、それを変えることはありません。私たちは、私を想定して(今トリッキーな部分は、年が不十分表されていることで、CTEでクエリをラップすることから、クエリとそのOrderNumOrderID

とともに、最新のOrderYearを持っているOrderType決定するrow_number関数を適用します元の投稿に対するコメントが真である場合)、OrderTypeBの任意の種類の集計を使用すると、数値的に最も大きいので95を返します。

注文の日付が今年よりも大きくなることはなく、次の文を使用して90年代以降のものはすべてwhere OrderYear < right(year(getdate()),2)と仮定します。言い換えれば、今年とその2つの正しいキャラクターを手に入れよう。まず、getdateから2017を検索し、次にRIGHT関数を使用して17を検索します。あなたの最新の日付が1999であれば、なぜ危険なのか分かりますか?

だから、それらをフィルタリングすることによって、我々は各OrderTypeの最新の年を見ることができます...これが役立つことを望みます。

Hereは、試してみたい場合に備えて、私があなたの質問を再生するために構築した再テスターテストです。

0

私はあなたの元のクエリはあなたが使用する必要がある以外、あなたが必要なほぼ正確に何だったと思いますMAX(OrderID)であり、それによってグループ化されません。

declare @Something table 
(
    orderid varchar(6) 
) 

insert @Something 
(
    orderid 
) values 
('A04-05'), ('B81-02'), ('C02-01'), 
('A01-01'), ('B95-01'), ('C99-05'), 
('A02-02'), ('B06-07'), ('C03-02'), 
('A98-06'), ('B10-01'), ('C17-01'), 
('A78-07'), ('B02-03'), ('C15-03'), 
('A79-01'), ('B02-01'), ('C78-06') 

select max(orderid), 
substring(orderid, 0, patindex('%[0-9]%', orderid)) as ordtype, 
right(max(datepart(yyyy,'01/01/' + substring(orderid, patindex('%[0-9]-%', orderid) - 1, 2))),2) as year, 
max(substring(orderid, patindex('%-[0-9]%', orderid) + 1, 2)) as ordnum 
from myTable 
where orderid is not null 
group by substring(orderid, 0, patindex('%[0-9]%', orderid)) 
order by ordtype 
関連する問題