>source

아래와 같은 데이터가 있습니다.

<테이블 클래스="s-테이블"> <머리> 관리자 도시 건물 바닥 좌석 수 <바디> xxx BLR SA2 2층 2 xyz BLR SA2 2층 3 자야 BLR SA2 3층 2 xjk BLR SA2 3층 1

결과 데이터는 다음과 같아야 하며, 관리자 또는 건물 및 층별로 그룹화되며 좌석 수에 따라 일련의 번호를 생성해야 합니다.

<테이블 클래스="s-테이블"> <머리> 관리자 도시 건물 바닥 좌석 수 <바디> xxx BLR SA2 2층 1 xxx BLR SA2 2층 2 xyz BLR SA2 2층 3 xyz BLR SA2 2층 4 xyz BLR SA2 2층 5 자야 BLR SA2 3층 1 자야 BLR SA2 3층 2 xjk BLR SA2 3층 3
  • 답변 # 1

    아래의 솔루션은 최대 좌석 수에 의존하지 않습니다.

    WITH
    /*
      MYTAB (Manager, City, Building, Floor, Number_of_Seats) AS
    (
    VALUES
      ('xxx', 'BLR', 'SA2', '2F', 2)
    , ('xyz', 'BLR', 'SA2', '2F', 3)
    , ('xya', 'BLR', 'SA2', '3F', 2)
    , ('xjk', 'BLR', 'SA2', '3F', 1)
    )
    ,
    */
      T (Manager, City, Building, Floor, Number_of_Seats) AS
    (
    SELECT Manager, City, Building, Floor, Number_of_Seats
    FROM MYTAB
        UNION ALL
    SELECT Manager, City, Building, Floor, Number_of_Seats -1
    FROM T
    WHERE Number_of_Seats > 1
    )
    SELECT
      Manager, City, Building, Floor
    , ROW_NUMBER () OVER (PARTITION BY City, Building, Floor ORDER BY Manager) AS Number_of_Seats
    FROM T
    ORDER BY City, Building, Floor, Manager
    

    commended out 블록의 주석을 제거하고 명령문을 있는 그대로 실행하면 다음과 같은 결과를 얻을 수 있습니다.

    <테이블 클래스="s-테이블"> <머리> 관리자 도시 건물 플로어 NUMBER_OF_SEATS <바디> xxx BLR SA2 2층 1 xxx BLR SA2 2층 2 xyz BLR SA2 2층 3 xyz BLR SA2 2층 4 xyz BLR SA2 2층 5 xjk BLR SA2 3층 1 자야 BLR SA2 3층 2 자야 BLR SA2 3층 3
  • 답변 # 2

    with row_gen(rn) as (
      SELECT 1 AS rn FROM SYSIBM.SYSDUMMY1
        UNION ALL
        SELECT rn+1  FROM row_gen WHERE rn+ 1 <=50
        )
        ,data
        as (
        select tb.manager,tb.location,tb.building,tb.floor,rg.rn
          from row_gen rg
          join db2inst1.tmp_cio_data tb
            on  rg.rn <= tb.seat_range_to
            )
    select d.manager,d.location,d.building,d.floor,
         row_number() over(partition by d.location,d.building,d.floor order by d.manager) as no_of_seats
      from data d WHERE d.floor= 11 AND d.building= '12D'
    

  • 답변 # 3

    no_of_seats로 제품을 주문한 다음 관리자 ID로 주문합니다.

    이를 수행하는 방법은 다음과 같습니다.

    with row_gen(rn) as (
            select 1 from SYSIBM.SYSDUMMY1
            union all
            select rn+ 1 from dummy where id < 10000 /*assumption that the number of seats isnt more than 10000*/
        )
        ,data
        as (
        select tb.mgr,tb.city,tb.bldg,tb.floor,rg.rn
          from row_gen rg
          join table tb
            on tb.no_of_seats<=rg.rn
            )
    select d.mgr,d.city,d.bldg,d.floor
          ,row_number() over(partition by d.city,d.bldg,d.floor order by d.mgr) as no_of_seats
      from data d
    

    정말 감사합니다. 최종 쿼리는 다음과 같이 미세 조정됩니다.

    user15514262022-01-04 17:24:12
  • 이전 macos : Brew 설치 -유효한 참조 오류가 아닙니다.
  • 다음 c# : 사용자 정의 비교자를 사용하여 MM-YYYY 문자열 정렬