Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当列为字符串数据类型时,在mssql中使用“Pivot”将行转换为列_Sql_Sql Server_Pivot - Fatal编程技术网

当列为字符串数据类型时,在mssql中使用“Pivot”将行转换为列

当列为字符串数据类型时,在mssql中使用“Pivot”将行转换为列,sql,sql-server,pivot,Sql,Sql Server,Pivot,我需要知道,如果没有要使用的聚合函数,MS SQL中的“pivot”是否可以用于将行转换为列。我看到很多只使用聚合函数的示例。我的字段是字符串数据类型,我需要将行数据转换为列数据。这就是我写这个问题的原因。我只是用“case”来做。有人能帮我吗……提前谢谢 样本格式 empid代码金额 1基本1000 1 TA 500 1 DA 500 2基础1500 2 TA 750 2 DA 750 empid基本TA DA 1 1000 500 500 215050750 我得到的答案

我需要知道,如果没有要使用的聚合函数,MS SQL中的“pivot”是否可以用于将行转换为列。我看到很多只使用聚合函数的示例。我的字段是字符串数据类型,我需要将行数据转换为列数据。这就是我写这个问题的原因。我只是用“case”来做。有人能帮我吗……提前谢谢

样本格式

empid代码金额 1基本1000 1 TA 500 1 DA 500 2基础1500 2 TA 750 2 DA 750

empid基本TA DA 1 1000 500 500 215050750

我得到的答案是

试试这个:

SELECT empid AS EmpID     
, ISNULL(SUM(CASE wagecode WHEN 'basic' THEN Amount ELSE 0 END), 0) AS Basic         
, ISNULL(SUM(CASE wagecode WHEN 'ta' THEN Amount ELSE 0 END), 0) AS TA     
, ISNULL(SUM(CASE wagecode WHEN 'da' THEN Amount ELSE 0 END), 0) AS DA 
FROM Employee
GROUP BY empid 
您可以使用来执行此操作。执行透视时,可以使用以下两种方法之一进行操作:使用静态透视对要转换的行进行编码,或使用动态透视在运行时创建列列表:

静态轴请参见:

动态轴:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(wagecode) 
                  FROM t1 
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT empid, ' + @cols + ' from 
             (
                 select empid, wagecode, amount
                 from t1
            ) x
            pivot 
            (
                sum(amount)
                for wagecode in (' + @cols + ')
            ) p '

execute(@query)

这两种方法都会得到相同的结果

您可以在varchar上始终使用min或max。pivot网格中每个位置只能有一个值。感谢您的响应。。看,我的问题是,假设有一个员工,他有很多行数据。我需要选择此数据作为单行。所以问题是我不能使用最小值或最大值…。如果您提供示例数据和该数据的一些期望结果,那么我们可能会看到您正在尝试做什么,以及为什么最小值/最大值不适用于您。好的。我会给您数据格式。empid wagecode金额1基本1000 1 TA 500 1 DA 500 2基本1500 2 TA 750 2 DA 750,我需要ans作为empid基本TA DA 1 1000 500 2 1500 750@V.P Verma:谢谢您的重播。我选择pivote的原因是为了降低查询的复杂性和减少执行时间。我不知道确切的原因,但我认为pivote在这种情况下比case更好。再次感谢您的重播。我想知道pivote或case更快。顺便说一句,您可以在这里看到动态查询:我只需要调整查询终止符,以便声明段没有与您的其他部分分开执行code@JakeFeasel谢谢你的补充,我没有时间做这两个小提琴morning@bluefeet当然,没问题。“查询终止器UI控件非常新,不确定您是否知道它/它何时可能有用。@JakeFeasel它非常有用,我不知道添加了它。
SELECT *
FROM
(
  select empid, wagecode, amount
  from t1
) x
pivot
(
  sum(amount)
  for wagecode in ([basic], [TA], [DA])
) p
DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(wagecode) 
                  FROM t1 
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT empid, ' + @cols + ' from 
             (
                 select empid, wagecode, amount
                 from t1
            ) x
            pivot 
            (
                sum(amount)
                for wagecode in (' + @cols + ')
            ) p '

execute(@query)