#sql #sql-server
#sql #sql-сервер
Вопрос:
Как мы можем показать 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)
Где логика есть:
Я хочу, чтобы категория и подкатегория были вместе, где категория должна показывать сумму всех значений подкатегорий и должна быть в порядке, так как у меня есть выходная таблица
Комментарии:
1. Пожалуйста, предоставьте примеры данных, желаемые результаты и соответствующий тег базы данных.
2. @GordonLinoff Я предоставил образцы данных, если вы знаете, пожалуйста, дайте мне знать..
3. база данных @pinkyadhikari? MySQL? MSSQL?
4. @PrashantPimpale SQL server
5. @pinkyadhikari какова логика этого ожидаемого результата?
Ответ №1:
select category, sum(values) values from table group by category
union
select subcategory, values from table
Ответ №2:
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
Ответ №3:
Вы можете использовать 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);
Ответ №4:
Попробуй это.
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
Ответ №5:
Требуется ОБЪЕДИНИТЬ ВСЕ после получения сумм с основной таблицей:
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
Ответ №6:
Простой способ сделать это использует grouping sets
:
select coalesce(subcategory, category) as new, sum(val)
from temp
group by grouping sets ( (category), (subcategory, category))
order by category, subcategory
Вот скрипка db<>.
Ответ №7:
Структура таблицы:
Идентификатор, имя, ParentCategoryID
1, животные, null
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
Предварительный просмотр:
Имя, вложенные
Животные, рыбы