【问题标题】:Convert Rows to columns using 'Pivot' in mssql when columns are string data type当列是字符串数据类型时,使用 sql 中的“Pivot”将行转换为列
【发布时间】:2012-06-14 03:36:31
【问题描述】:

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

【问题讨论】:

  • 您始终可以在 varchar 上使用 min() 或 max()。枢轴网格中的每个位置应该只有一个值。
  • 感谢您的回复.. 看到我的问题是,假设有一名员工,他有很多行数据。我需要将此数据选择为单行。所以问题是我不能使用 min() 或 max() ....
  • 最好能提供示例数据和该数据的一些期望结果,以便我们了解您正在尝试做什么以及为什么 MIN / MAX 不适合您。跨度>
  • 好的。我会给你数据格式。 empid 工资代码金额 1 basic 1000 1 TA 500 1 DA 500 2 Basic 1500 2 TA 750 2 DA 750 我需要 ans 作为 empid BASic TA DA 1 1000 500 500 2 1500 750 750

标签: sql sql-server pivot


【解决方案1】:

您可以使用PIVOT 来执行此操作。进行 PIVOT 时,您可以通过以下两种方式之一进行操作,使用静态枢轴,您将编码要转换的行,或者使用动态枢轴,它将在运行时创建列列表:

静态枢轴(参见SQL Fiddle with a Demo):

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)

这两个都会给你相同的结果

【讨论】:

  • 顺便说一句 - 你可以在这里看到你的动态查询:sqlfiddle.com/#!3/88cd4/4(我只需要调整查询终止符,这样声明段就不会与你的代码的其余部分分开执行)
  • @JakeFeasel 感谢您的补充,今天早上我没有时间做这两个小提琴
  • @bluefeet 当然,没有问题。查询终结器 UI 控件非常新,不确定您是否知道它/何时可能有用。
  • @JakeFeasel 非常有帮助,我不知道已添加。
【解决方案2】:

样本格式

empid     工资代码    金额
1              基本           1000
1              TA               500
1              DA               500
2              基本的           1500
2              TA               750
2              DA               750

empid      基本       TA        DA
1            1000         500      500
2            1500         750       750

我得到的答案是

   SELECT empID , [1bas] as basic, [1tasal] as TA,[1otsal] as DA
   FROM (
   SELECT empID, wage, amount
   FROM table) up
   PIVOT (SUM(amt) FOR wgcod IN ([1bas], [1tasal],[1otsal])) AS pvt
   ORDER BY empID 
   GO

【讨论】:

    【解决方案3】:

    试试这个:

    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 
    

    【讨论】:

    • @V.P Verma:感谢您的重播。为什么我选择 pivote 是为了降低查询的复杂性并减少执行时间..我不知道确切但我认为在这种情况下 pivote 比 case 更好..再次感谢重播..并且想要知道 pivote 或 case 更快..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多