2

私は次のようなテーブルを持っています

ID     ENVI              SERVER               GROUP         ACTIVE
==     ====              ======              ======         ======
1      Developent        AREGION_1            A               1
2      Developent        AREGION_2            A               1
3      Developent        AREGION_3            A               1
4      Developent        BREGION_1            B               1
5      Developent        BREGION_2            B               1
6      Developent        BREGION_3            B               1
7      Developent        CREGION_1            C               1
8      Developent        CREGION_3            C               1
9      Developent        A1REGION             A               1
10     Developent        A2REGION             A               1
11     Developent        ABCREGION            A               1

ENVI以下のような結果を返す入力パラメータを持つspを書く必要があります

ENVI                A             B              C
====                =========     =========      =========
Development         AREGION_1     BREGION_1      CREGION_1  (All servers Ending with _1)
Development         AREGION_2     BREGION_2                 (All servers Ending with _2)
Development         AREGION_3     BREGION_3      CREGION_3  (All servers Ending with _3)
Development         A1REGION     
Development         A2REGION     
Development         ABCREGION

条件は次のとおりです。 number で終わるすべてのサーバーは_、最初にソートされた順序で来る必要があります。いずれかの列に行の値がない場合、そのフィールドは null または空にする必要があります。任意のグループの下にランダムな名前を持つサーバーは、そのグループの下に最後に配置する必要があります。

SPの作成を手伝ってください

前もって感謝します

4

2 に答える 2

2

You did not specify what version of sybase you are using, this answer assumes you have a version with access to windowing functions. Sybase does not have a PIVOT function so you will have to replicate it using an aggregate function with a CASE expression.

The following code should get the result that you want:

select envi,
  max(case when serverGroup = 'A' then server end) as A,
  max(case when serverGroup = 'B' then server end) as B,
  max(case when serverGroup = 'C' then server end) as C
from
(
  select envi,
    server,
    serverGroup,
    case 
      when frn > rn then frn
      else rn
    end rn    
  from
  (
    select envi,
      server, 
      serverGroup,
      case 
        when charindex('_', SERVER) = 0
        then 0
        else substring(SERVER, charindex('_', SERVER)+1, len(SERVER))
      end frn, 
      row_number() over(partition by envi, serverGroup 
                        order by substring(SERVER, charindex('_', SERVER), len(SERVER)+1)) rn
    from ytable
  ) d
) x
group by envi, rn
order by rn;

See SQL Fiddle with Demo. note: the demo is on SQL Server.

This gives the result:

|       ENVI |         A |         B |         C |
--------------------------------------------------
| Developent | AREGION_1 | BREGION_1 | CREGION_1 |
| Developent | AREGION_2 | BREGION_2 |    (null) |
| Developent | AREGION_3 | BREGION_3 | CREGION_3 |
| Developent |  A1REGION |    (null) |    (null) |
| Developent |  A2REGION |    (null) |    (null) |
| Developent | ABCREGION |    (null) |    (null) |
于 2013-04-04T10:47:17.213 に答える
0

これは集計クエリですが、最終結果には集計列の 1 つ (変更されたサーバー名) が含まれていません。

select envi,
       max(case when group = 'A' then server end) as A,
       max(case when group = 'B' then server end) as B,
       max(case when group = 'C' then server end) as C
from t
group by envi,
         (case when server like '%[_]%' and server not like '%[_]%[^0-9]%'
               then left(server, charindex('_', server) - 1)
               else server
          end)

ロジックはlike、アンダースコアがあり、アンダースコアの後に数字しかないサーバー名を探します。

于 2013-04-04T10:46:50.483 に答える