【问题标题】:Convert from ACCESS TRANSFORM COUNT/PIVOT to SQL SERVER 2005从 ACCESS TRANSFORM COUNT/PIVOT 转换为 SQL SERVER 2005
【发布时间】:2013-12-02 08:42:14
【问题描述】:

需要一些帮助,将 access TRANSFORM COUNT/PIVOT 转换为 SQL SERVER,这是 access 中的 sql:

TRANSFORM Count(tmpTbl.TC) AS CountOfTC
SELECT tmpTbl.SID, tmpTbl.CSID, tmpTbl.M,WoOr.QCL
FROM tmpTbl INNER JOIN WoOr ON tmpTbl.WO = WoOr.WO
WHERE (((tmpTbl.IsSelected)=True))
GROUP BY tmpTbl.SID, tmpTbl.CSID, tmpTbl.M,WoOr.QCL
PIVOT tmpTbl.TN;

输出:

SID |   CSID | M |   QCL | EPA 1 | EPA 2 |
-----------------------------------------|
1   |   A    |GW |  IV   |  3    |       |
2   |   B    |GW |  IV   |       |  4    |
------------------------------------------

tmpTbl Table 中找到 3 EPA 1 计数和 4 EPA 2 计数。

提前感谢您!

【问题讨论】:

  • 您能否展示一些示例数据以及所需的输出??
  • 所需的输出与上面的输出相同。先生。注意:EPA 的是动态的。

标签: sql-server vb.net pivot transform


【解决方案1】:

SQL Server 不使用 TRANSFORM 关键字和 PIVOT 将数据行转换为列。 PIVOT 的基本语法将使用来自MSDN 的示例:

SELECT <non-pivoted column>,   -- your final columns displayed will be in this select
    [first pivoted column] AS <column name>,
    [second pivoted column] AS <column name>,
    ...
    [last pivoted column] AS <column name>
FROM
(
   <SELECT query that produces the data>  -- the FROM will include your existing select from/join 
) AS <alias for the source query>
PIVOT
(
   <aggregation function>(<column being aggregated>)  -- your count Count(tmpTbl.TC)
   FOR
   [<column that contains the values that will become column headers>]  -- the FOR includes the tmpTbl.TN
    IN ( [first pivoted column], [second pivoted column],               -- the IN will be your EPA1 and EPA2 values
    ... [last pivoted column])
) AS <alias for the pivot table>

一旦您了解现有 Access 查询中的所有部分在 SQL Server 数据透视表中的位置,就可以轻松编写语法。您当前的查询将在 SQL Server 中如下所示:

select sid, csid, m, qcl, [EPA 1], [EPA 2]
from
(
    select t.sid, t.csid, t.m, w.qcl, t.tc, t.tn
    from tmpTbl t
    inner join WoOr w
        on t.wo = w.wo
    where t.isselected = 1
) d
pivot
(
    count(tc)
    for tn in ([EPA 1], [EPA 2])
) piv;

如果你有未知的值,那么你会想要使用动态 SQL 来获取结果:

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(tn) 
                    from tmpTbl
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT sid, csid, m, qcl, ' + @cols + ' 
            from 
            (
              select t.sid, t.csid, t.m, w.qcl, t.tc, t.tn
              from tmpTbl t
              inner join WoOr w
                  on t.wo = w.wo
              where t.isselected = 1
            ) x
            pivot 
            (
                count(tc)
                for tn in (' + @cols + ')
            ) p '

execute sp_executesql @query;

【讨论】:

  • 谢谢您的回复,先生,但 EPA 的 是动态的,然后 计数 先生找到了多少相同的 EPA..
  • @Unknownymous 查看我的编辑,如果值未知,那么您将需要使用动态 SQL。
  • 感谢您的快速回复。我回家后会试试这个。现在有什么替代方法可以使它成为一条线/段,因为我会将它集成到我在 Visual Studio 中的 dataadpter 中。
  • @unknownymous 你必须把这段代码放在一个存储过程中然后执行一行。
猜你喜欢
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-18
  • 1970-01-01
相关资源
最近更新 更多