Как извлечь данные из этой таблицы и преобразовать их в этот конкретный формат, используя t-sql? - PullRequest
0 голосов
/ 05 июня 2019

Я использую SQL Server 2014.Ниже приведена выдержка из таблицы под названием Table1:

ID     Market    Adult   AdultAge   0-5   6-12   13-17
100     UK         1        50       0     0       0
105     UK         2        36       0     0       0
107     DE         1        65       0     1       0
110     FR         2        42       0     2       1 
115     BE         1        18       1     0       0  

Столбцы 0-5, 6-12 и 13-17 являются возрастными категориями и содержат количество детей.

Iнеобходимо преобразовать эту таблицу в следующий формат и использовать следующую логику:

  • Если число взрослых составляет 2, то возраст 2-го взрослого будет зарегистрированным возрастом минус 2.
  • Возраст ребенка будет серединой его возрастной категории.То есть, если есть 1 ребенок (или 2 или более детей) в определенной категории (скажем, 6–12), то возраст ребенка (или каждого ребенка, если их больше 1), будет (12 + 6) /2 = 9 лет.Та же логика применима и к другим возрастным категориям.

Итак, вот конечный результат, который я ищу:

ID      Market   Age    Category
100     UK       50      Adult
105     UK       36      Adult
105     UK       34      Adult
107     DE       65      Adult
107     DE        9      Child
110     FR       42      Adult
110     FR       40      Adult
110     FR        9      Child
110     FR        9      Child
110     FR       15      Child
115     BE       18      Adult
115     BE        2.5    Child

Я думаю об использовании некоторых операторов CASE дляконвертировать данные, но я действительно не понимаю, как реализовать то же самое.

Любая помощь будет высоко ценится.

Ответы [ 2 ]

3 голосов
/ 05 июня 2019

Вам нужен сложный unpivot. Один из способов сделать это - использовать таблицу подсчета для создания нескольких строк, а также использовать cross apply:

;WITH Tally (n) AS
(
    -- 1000 rows
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
    FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) a(n)
    CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) b(n)
    CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) c(n)
)
SELECT t.id,t.market,q.*
FROM  [Table1] t
outer apply
(
    select t.adultage,'Adult' where adult>=1
    union all
    select adultage-2,'Adult' where adult=2
    union all
    select 2.5,'Child' from Tally where n<=[0-5]
    union all
    select 9,'Child' from Tally  where n<=[6-12]
    union all
    select 15,'Child' from Tally  where n<=[13-17]
)q(Age,Category)
1 голос
/ 05 июня 2019

Это немного сложно, но поможет таблица чисел. Вы можете легко сгенерировать его, используя рекурсивный CTE (до 100), или у вас может быть один лежащий рядом.

Затем вам нужно отключить и применить немного больше логики:

with numbers as (
      select 1 as n
      union all
      select n + 1
      from numbers
      where n <= 10
     )
select x.*
from table1 t1 cross apply
     (select t1.ID, t1.Market, category,
             (case when v.category = 'Adult' and n.n = 2 then v.age - 2
                   else v.age
              end) as age
      from (values (t1.AdultAge, 'Adult', t1.Adult),
                   (2.5, 'Child', t1.[0-5]),
                   (9, 'Child', t1.[6-12]),
                   (15, 'Child', t1.[13-17])
           ) v(age, category, cnt) join
           numbers n
           on n.n <= v.cnt
     ) x;

Здесь - это дБ <> скрипка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...