gpt4 book ai didi

sql - 将列的值作为相同查询的不同列分开

转载 作者:行者123 更新时间:2023-12-04 20:48:16 24 4
gpt4 key购买 nike

我有一张 table UTENSILS像这样有 3 列:

CLASS_NAME   RANGE    COUNT
---------------------------
pens 0-0.5 200
pencil 0-0.5 50
pens 0.5-1.0 300
pencil 0.5-1.0 40
pens 1.0-1.5 150
pencil 1.0-1.5 45

我想要一个显示上表结果的查询,如下所示:
RANGE      Pens        Pencils
------------------------------
0-0.5 200 50
0.5-1.0 300 40
1.0-1.5 150 45

关于这个的任何想法?提前致谢!

最佳答案

您正在尝试做的事情被称为 PIVOT .这是将数据从行转换为列的时候。一些数据库有 PIVOT您可以利用的功能,但您没有指定哪个 RDBMS。

如果您没有 PIVOT函数,然后您可以使用聚合函数和 CASE 复制该功能。陈述:

select `range`,
sum(case when class_name = 'pens' then `count` end) pens,
sum(case when class_name = 'pencil' then `count` end) pencils
from yourtable
group by `range`

SQL Fiddle with Demo

注意:反引号用于 MySQL,如果 SQL Server 则在 range 周围使用方括号和 count .这些用于转义保留字。

如果您在具有 PIVOT 的 RDBMS 中工作功能,那么您可以使用以下内容:
select *
from
(
select class_name, [range], [count]
from yourtable
) src
pivot
(
sum([count])
for class_name in ([pens], [pencil])
) piv

SQL Fiddle with Demo

两者都会产生相同的结果:
|   RANGE | PENS | PENCIL |
---------------------------
| 0-0.5 | 200 | 50 |
| 0.5-1.0 | 300 | 40 |
| 1.0-1.5 | 150 | 45 |

如果您有已知数量的 class_name 值,上述方法会很有效。 ,如果您不这样做,则根据您的 RDBMS,有多种方法可以生成此查询的动态版本。

在 SQL Server 中,动态版本类似于:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(CLASS_NAME)
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')

set @query = 'SELECT [range], ' + @cols + ' from
(
select CLASS_NAME, [RANGE], [COUNT]
from yourtable
) x
pivot
(
sum([COUNT])
for CLASS_NAME in (' + @cols + ')
) p '

execute(@query)

SQL Fiddle with Demo

关于sql - 将列的值作为相同查询的不同列分开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13643890/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com