我必须在一行中显示单个人的多个收入,收入类型和雇主名称值。因此,如果“ A”有来自三个不同来源的三个不同的收入,
id | Name | Employer | IncomeType | Amount
123 | XYZ | ABC.Inc | EarningsformJob | $200.00
123 | XYZ | Self | Self Employment | $300.00
123 | XYZ. | ChildSupport| Support | $500.00
我需要向他们展示
id | Name | Employer1 | Incometype1| Amount1 | Employer2 | incometype2 | Amount2| Employer3 | Incometype3| Amount3.....
123 |XYZ | ABC.Inc |EarningsformJob | $200.00|Self | Self Employment | $300.00|ChildSupport| Support | $500.00.....
我既需要“固定列数”(我们知道雇主,收入类型和金额列将要重复多少次)逻辑又需要“动态显示列”(未知这些列要重复的次数)
谢谢。
由于使用的是SQL Server,因此有几种方法可以将数据行转置为列。
聚合函数/ CASE: 您可以将聚合函数与CASE表达式一起使用row_number()
。此版本要求您具有已知数量的值才能成为列:
select id,
name,
max(case when rn = 1 then employer end) employer1,
max(case when rn = 1 then IncomeType end) IncomeType1,
max(case when rn = 1 then Amount end) Amount1,
max(case when rn = 2 then employer end) employer2,
max(case when rn = 2 then IncomeType end) IncomeType2,
max(case when rn = 2 then Amount end) Amount2,
max(case when rn = 3 then employer end) employer3,
max(case when rn = 3 then IncomeType end) IncomeType3,
max(case when rn = 3 then Amount end) Amount3
from
(
select id, name, employer, incometype, amount,
row_number() over(partition by id order by employer) rn
from yourtable
) src
group by id, name;
请参阅带有演示的SQL Fiddle。
PIVOT / UNPIVOT:
您可以使用UNPIVOT和PIVOT函数来获取结果。该UNPIVOT转换您的多列Employer
,IncomeType
并Amount
为多排应用枢轴之前。您没有具体说明哪个版本的SQL
Server,假设您拥有已知数量的值,则可以在SQL Server 2005+中使用以下内容,该版本使用CROSS APPLY和UNION
ALL来取消透视:
select id, name,
employer1, incometype1, amount1,
employer2, incometype2, amount2,
employer3, incometype3, amount3
from
(
select id, name, col+cast(rn as varchar(10)) col, value
from
(
select id, name, employer, incometype, amount,
row_number() over(partition by id order by employer) rn
from yourtable
) t
cross apply
(
select 'employer', employer union all
select 'incometype', incometype union all
select 'amount', cast(amount as varchar(50))
) c (col, value)
) src
pivot
(
max(value)
for col in (employer1, incometype1, amount1,
employer2, incometype2, amount2,
employer3, incometype3, amount3)
) piv;
请参阅带有演示的SQL Fiddle。
动态版本: 最后,如果您有未知数量的值,则需要使用动态SQL生成结果。
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(col+cast(rn as varchar(10)))
from
(
select row_number() over(partition by id order by employer) rn
from yourtable
) d
cross apply
(
select 'employer', 1 union all
select 'incometype', 2 union all
select 'amount', 3
) c (col, so)
group by col, rn, so
order by rn, so
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT id, name,' + @cols + '
from
(
select id, name, col+cast(rn as varchar(10)) col, value
from
(
select id, name, employer, incometype, amount,
row_number() over(partition by id order by employer) rn
from yourtable
) t
cross apply
(
select ''employer'', employer union all
select ''incometype'', incometype union all
select ''amount'', cast(amount as varchar(50))
) c (col, value)
) x
pivot
(
max(value)
for col in (' + @cols + ')
) p '
execute(@query);
请参阅带有演示的SQL Fiddle。所有版本都会产生结果:
| ID | NAME | EMPLOYER1 | INCOMETYPE1 | AMOUNT1 | EMPLOYER2 | INCOMETYPE2 | AMOUNT2 | EMPLOYER3 | INCOMETYPE3 | AMOUNT3 |
-------------------------------------------------------------------------------------------------------------------------------------
| 123 | XYZ | ABC.Inc | EarningsformJob | 200 | ChildSupport | Support | 500 | Self | Self Employment | 300 |
我在presto上有一个表,它有多个记录的记录。在该记录中,我使用了这个简单的SQL查询,
问题内容: 我有一个具有这种结构的表。 我无法弄清楚我将使用哪种SQL查询来获得这样的结果集: 我正在尝试将三列分为三个单独的行。这可能吗? 问题答案: SELECT Y.UserID, Y.UserName, QuestionName = ‘AnswerToQuestion’ + X.Which, Response = CASE X.Which WHEN ‘1’ THEN AnswerToQue
问题内容: 请帮我这个: 我想按列TestType分组,但如果它们具有相同的TestType,则应将Result拆分为colunms 我希望SQL以这种格式返回数据 Result#列应该是动态的,因为每个TestType都有很多结果 问题答案: 正如我在评论中所提到的,这里您需要的是或交叉标签;我更喜欢后者,所以我将要使用的东西。 对此的非动态解决方案如下: 但是,问题在于这会将您“锁定”到3个结
问题内容: 我的问题是我有一个这样的表: c1 | c2 | c3 | c4是一个由|分隔的值。 我的最终结果应如下所示: 我该怎么做呢? 谢谢 问题答案: 这就是您可以执行的操作,使用管道将字符串拆分并使用spark函数爆炸数据 输出: 希望这可以帮助!
问题内容: 我有一个带有列的详细信息表: user_id int 代码int 值int 我想建立一个汇总表,如下所示: user_id int valueA int valueB int 在详细信息表中,valueA对应于说代码5,而valueB对应于说代码6,所以我正在寻找类似的东西: 插入摘要(user_id,valueA,valueB)VALUES(从详细信息中选择???); 当然,问题是我
问题内容: 假设我在MySQL数据库中有两个表。 表格1: 表2: 从数据库中选择行时,是否有任何方法可以将第二个表中的行作为列连接到第一个表中?目前我正在使用。 输出: 目前,我正在PHP脚本中对此进行排序,以将其排序为一个数组。这很痛苦,因为我必须查看ID,看看它们是否相同,然后进行相应的排序。我觉得有一种方法可以在MySQL中正确执行此操作,而不必在PHP中将其分类为数组。每个ID在第二个表