Категория и подкатегория в одном столбце в sql - PullRequest
0 голосов
/ 19 апреля 2019

Как мы можем показать category и subcategory в одном столбце в sql.Оба столбца присутствуют в одной и той же таблице TableA.

Пример: TableA

--------------------------------------
| category |  subcategory |  Values  |
--------------------------------------
| Bird     |  parrot       |     5   |
| Bird     |  pigeon       |     10  |
| Animal   |  lion         |     2   |
| Animal   |  Tiger        |     5   |
--------------------------------------

Таблица вывода:

-------------------
| NEW    |  Value  |
--------------------
| Bird   |   15    |
| parrot |   5     |
| Piegon |   10    |
| Animal |   7     |
| lion   |   2     |
| Tiger  |   5     |
--------------------

На выходе New - этостолбец, в котором я хочу, чтобы категория и подкатегория.

Пример запроса для создания данных:

CREATE TABLE #TEMP
(
catgory nvarchar(200),
sub_category nvarchar(200),
[values] nvarchar(200),
)

INSERT INTO #TEMP VALUES ('Bird','parrot',5)
INSERT INTO #TEMP  VALUES ('Bird','pigeon',10)
INSERT INTO #TEMP VALUES ('Animal','lion',2)
INSERT INTO #TEMP VALUES ('Animal','Tiger',5)

Где логика:

Я хочу, чтобы категория и подкатегория вместе,Где категория должна показывать сумму всех значений подкатегорий и должна быть в порядке, поскольку у меня есть выходная таблица

Ответы [ 7 ]

0 голосов
/ 19 апреля 2019

Требуется UNION ALL после получения сумм с основной таблицей:

select 
  case t.sub_category
    when '' then t.category
    else sub_category
  end new,
  t.value
from (
  select category, '' sub_category, sum([values]) value from temp group by category
  union all
  select category, sub_category, [values] value from temp
) t
order by t.category, t.sub_category

См. Демоверсию .Результаты:

> new    | value
> :----- | ----:
> Animal |     7
> lion   |     2
> Tiger  |     5
> Bird   |    15
> parrot |     5
> pigeon |    10
0 голосов
/ 19 апреля 2019

Простой способ сделать это использует grouping sets:

select coalesce(subcategory, category) as new, sum(val)
from temp
group by grouping sets ( (category), (subcategory, category))
order by category, subcategory

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

0 голосов
/ 19 апреля 2019

Вы можете использовать cte:

with cte as (
     select t.*, 
            dense_rank() over (order by category) as seq, 
            sum([values]) over (partition by category) as sums
     from table t
)

select t.cat as new, (case when cat_name = 'category' then sums else c.[values] end) as Value
from cte c cross apply
     ( values ('category', category), ('sub_category', sub_category) ) t(cat_name, cat)
order by seq, (case when cat_name = 'category' then 1 else 2 end);
0 голосов
/ 19 апреля 2019

Структура таблицы:

Идентификатор, имя, parentcategoryId

1, животные, ноль

2, рыба, 1

Пример mssql:

Select name,  subcats = STUFF((
            SELECT ',' + NAME
            FROM category as cat1 where cat1.parentcategoryId = cat. parentcategoryId
            FOR XML PATH('')
            ), 1, 1, '')  from category as cat where parentcategoryId = null

Предварительный просмотр:

Имя, подкадры

Животные, рыба

Я написал это со своего телефона, извините за плохое редактирование

0 голосов
/ 19 апреля 2019
select category, sum(values) values from table group by category
union
select subcategory, values from table
0 голосов
/ 19 апреля 2019
WITH cte AS
(
    SELECT category,value FROM yourtable WHERE category IS NOT NULL
    UNION ALL
    SELECT subcategory, value FROM yourtable WHERE subcategory IS NOT NULL    
)
SELECT Company as new, value FROM cte
0 голосов
/ 19 апреля 2019

Попробуйте это.

select new, [values] from (select catgory, sub_category as 'new', [values] from temp 
union all 
select catgory, catgory as 'new', sum([values]) from temp group by catgory) order by catgory

Вывод:

    new values
   -------------
    parrot  5
    pigeon  10
    Bird    15
    lion    2
    lion    2
    Tiger   5
    Animal  9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...