将 SQL Table 行变成列
Making SQL Table row into Column
我正在尝试创建一个查询,该查询将 return 一组具有值的列,这就是我目前得到的结果,
╔═══╦═══════════════╦═════════════╗
║ ║ProgramTypeName║ TypeAmount ║
╠═══╬═══════════════╬═════════════╣
║ 1 ║ Center ║ 4 ║
║ 2 ║ School ║ 2 ║
╚═══╩═══════════════╩═════════════╝
我从 Table 获取 ProgramTypeName,而 TypeAmount,Count(ProgramTypeName)。
我正在努力做到这一点,
╔═══╦═══════════════╦═════════════╗
║ ║Center ║ School ║
╠═══╬═══════════════╬═════════════╣
║ 1 ║ 4 ║ 2 ║
╚═══╩═══════════════╩═════════════╝
关于我可以做些什么来实现这个目标有什么想法吗?
@Indian 这是我从你的建议中得到的结果,
╔═══╦═══════════════╦═════════════╗
║ ║Center ║ School ║
╠═══╬═══════════════╬═════════════╣
║ 1 ║ NULL ║ NULL ║
║ 2 ║ NULL ║ NULL ║
║ 3 ║ NULL ║ 2 ║
╚═══╩═══════════════╩═════════════╝
正常查询数据时我有这个,
╔═══╦══════════╦═════════════╦════════╦════════════════╦═══════╗
║ ║License ║ ProgName ║ Id ║ProgramTypeName ║Amount ║
╠═══╬══════════╬═════════════╬════════╬════════════════╬═══════╣
║ 1 ║ 45871 ║ TestName ║ 1 ║ Center ║ 4 ║
║ 2 ║ 45871 ║ TestName ║ 1 ║ School ║ 4 ║
║ 3 ║ 45871 ║ TestName ║ 1 ║ Other ║ 2 ║
╚═══╩══════════╩═════════════╩════════╩════════════════╩═══════╝
使用 conditional Aggregate
将适用于 Mysql
和 Sql Server
select
max(case when ProgramTypeName = 'Center' then TypeAmount END) as Center
max(case when ProgramTypeName = 'School' then TypeAmount END) as School
From (select ProgramTypeName ,Count(ProgramTypeName) from x ...) A
Group by somecol
测试数据
DECLARE @Table TABLE (ProgrameTypeName VARCHAR(20))
INSERT INTO @Table VALUES
('Central'),('Central'),('Central'),('Central')
,('School'),('School')
查询
SELECT *
FROM @Table t
PIVOT (
COUNT(ProgrameTypeName)
FOR ProgrameTypeName
IN ([Central],[School])
)p
结果
╔═════════╦════════╗
║ Central ║ School ║
╠═════════╬════════╣
║ 4 ║ 2 ║
╚═════════╩════════╝
我能够让它工作,
Select Max(Case When A.ProgName = 'Center' Then TypeAmount End) As Center,
Max(Case When A.ProgName = 'School' Then TypeAmount End) As School,
Max(Case When A.ProgName = 'Other' Then TypeAmount End) As Other
From T_Prog P Inner Join (Select ProgID,
ProgName,
Count(ProgName) As ProgAmount
From T_ProgType_Join PTJ Inner Join T_ProgramType PTJ On PT.ProgramTypeId = PT.ProgramTypeId
Where PTJ.ProgramId = @ProgID
Group by ProgName, ProgID) A On A.ProgID= P.ProgID
Where PTJ.ProgID= @ProgID
我正在尝试创建一个查询,该查询将 return 一组具有值的列,这就是我目前得到的结果,
╔═══╦═══════════════╦═════════════╗
║ ║ProgramTypeName║ TypeAmount ║
╠═══╬═══════════════╬═════════════╣
║ 1 ║ Center ║ 4 ║
║ 2 ║ School ║ 2 ║
╚═══╩═══════════════╩═════════════╝
我从 Table 获取 ProgramTypeName,而 TypeAmount,Count(ProgramTypeName)。
我正在努力做到这一点,
╔═══╦═══════════════╦═════════════╗
║ ║Center ║ School ║
╠═══╬═══════════════╬═════════════╣
║ 1 ║ 4 ║ 2 ║
╚═══╩═══════════════╩═════════════╝
关于我可以做些什么来实现这个目标有什么想法吗?
@Indian 这是我从你的建议中得到的结果,
╔═══╦═══════════════╦═════════════╗
║ ║Center ║ School ║
╠═══╬═══════════════╬═════════════╣
║ 1 ║ NULL ║ NULL ║
║ 2 ║ NULL ║ NULL ║
║ 3 ║ NULL ║ 2 ║
╚═══╩═══════════════╩═════════════╝
正常查询数据时我有这个,
╔═══╦══════════╦═════════════╦════════╦════════════════╦═══════╗
║ ║License ║ ProgName ║ Id ║ProgramTypeName ║Amount ║
╠═══╬══════════╬═════════════╬════════╬════════════════╬═══════╣
║ 1 ║ 45871 ║ TestName ║ 1 ║ Center ║ 4 ║
║ 2 ║ 45871 ║ TestName ║ 1 ║ School ║ 4 ║
║ 3 ║ 45871 ║ TestName ║ 1 ║ Other ║ 2 ║
╚═══╩══════════╩═════════════╩════════╩════════════════╩═══════╝
使用 conditional Aggregate
将适用于 Mysql
和 Sql Server
select
max(case when ProgramTypeName = 'Center' then TypeAmount END) as Center
max(case when ProgramTypeName = 'School' then TypeAmount END) as School
From (select ProgramTypeName ,Count(ProgramTypeName) from x ...) A
Group by somecol
测试数据
DECLARE @Table TABLE (ProgrameTypeName VARCHAR(20))
INSERT INTO @Table VALUES
('Central'),('Central'),('Central'),('Central')
,('School'),('School')
查询
SELECT *
FROM @Table t
PIVOT (
COUNT(ProgrameTypeName)
FOR ProgrameTypeName
IN ([Central],[School])
)p
结果
╔═════════╦════════╗
║ Central ║ School ║
╠═════════╬════════╣
║ 4 ║ 2 ║
╚═════════╩════════╝
我能够让它工作,
Select Max(Case When A.ProgName = 'Center' Then TypeAmount End) As Center,
Max(Case When A.ProgName = 'School' Then TypeAmount End) As School,
Max(Case When A.ProgName = 'Other' Then TypeAmount End) As Other
From T_Prog P Inner Join (Select ProgID,
ProgName,
Count(ProgName) As ProgAmount
From T_ProgType_Join PTJ Inner Join T_ProgramType PTJ On PT.ProgramTypeId = PT.ProgramTypeId
Where PTJ.ProgramId = @ProgID
Group by ProgName, ProgID) A On A.ProgID= P.ProgID
Where PTJ.ProgID= @ProgID