简体   繁体   English

如何在 SQL Server 中对列进行透视?

[英]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;

demo on dbfiddle.uk dbfiddle.uk 上的演示

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM