[英]How pivot columns in SQL Server?
I have a table with this values:我有一个包含此值的表:
Type | Value
---------------
A String
A Int
B String
B String
C Double
C Float
and I would like to know the query that returns this:我想知道返回这个的查询:
Type | String | Int | Double | Float
--------------------------------------------
A 1 1 0 0
B 2 0 0 0
C 0 0 1 1
How could I do it?我该怎么做?
You can use the following solution, using PIVOT
:您可以使用以下解决方案,使用PIVOT
:
SELECT Type, [String], [Int], [Double], [Float]
FROM (
SELECT Type, Value
FROM table_name
) st PIVOT (
COUNT(Value)
FOR Value IN ([String], [Int], [Double], [Float])
) AS pt;
How could I add a column with the sum of the values of each row and a row with the sum of the values of each column?我怎样才能添加一个包含每行值总和的列和一个包含每列值总和的行?
SELECT Type, [String], [Int], [Double], [Float], TotalRow
FROM (
SELECT Type, Value, COUNT(Value) OVER (PARTITION BY Type) AS TotalRow
FROM test
) st PIVOT (
COUNT(Value)
FOR Value IN ([String], [Int], [Double], [Float])
) pt
UNION ALL
SELECT 'Total', SUM([String]), SUM([Int]), SUM([Double]), SUM([Float]), SUM(TotalRow)
FROM (
SELECT Type, [String], [Int], [Double], [Float], TotalRow
FROM (
SELECT Type, Value, COUNT(Value) OVER (PARTITION BY Type) AS TotalRow
FROM test
) st PIVOT (
COUNT(Value)
FOR Value IN ([String], [Int], [Double], [Float])
) pt
)t;
You can try to use a conditional aggregated function.您可以尝试使用条件聚合函数。
SELECT Type,
COUNT(CASE WHEN VALUES = 'String' THEN 1 END) 'String',
COUNT(CASE WHEN VALUES = 'Int' THEN 1 END) 'Int',
COUNT(CASE WHEN VALUES = 'Double' THEN 1 END) 'Double',
COUNT(CASE WHEN VALUES = 'Float' THEN 1 END) 'Float'
FROM T
GROUP BY Type
You can also use Dynamic SQL PIVOT您还可以使用动态 SQL PIVOT
CREATE TABLE test (
DataType VARCHAR(10),
Value VARCHAR(10)
);
INSERT INTO test VALUES
('A', 'String'),
('A', 'Int'),
('B', 'String'),
('B', 'String'),
('C', 'Double'),
('C', 'Float');
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.Value)
FROM test c
FOR XML PATH(''), Type
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT DataType, ' + @cols + ' from
(
select DataType,Value
from test
) x
pivot
(
count(Value)
for Value in (' + @cols + ')
) p '
execute(@query)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.