Sql server 在不使用透视的情况下将行转换为列值的查询

Sql server 在不使用透视的情况下将行转换为列值的查询,sql-server,tsql,Sql Server,Tsql,我有下面的查询,并给出如下所示的结果 SELECT SUM(atm) atm,SUM(cc) cc,SUM(csh) csh ,SUM(chk) chk FROM sales WHERE repId= 9000 AND DATEADD(dd,0,DATEDIFF(dd,0,idate)) ='2013-08-25 00:00:00' 如何在不使用PIVOT重新运行结果的情况下修改查询,如下所示

我有下面的查询,并给出如下所示的结果

  SELECT      
      SUM(atm) atm,SUM(cc) cc,SUM(csh) csh ,SUM(chk) chk
    FROM  sales                 
    WHERE repId= 9000
          AND DATEADD(dd,0,DATEDIFF(dd,0,idate)) ='2013-08-25 00:00:00'

如何在不使用PIVOT重新运行结果的情况下修改查询,如下所示。 这应该行得通

SELECT  'atm' type, SUM(atm) Amount  FROM  sales                 
  WHERE repId= 9000 AND DATEADD(dd,0,DATEDIFF(dd,0,idate)) ='2013-08-25 00:00:00'
UNION ALL
SELECT  'cc' type, SUM(cc) Amount  FROM  sales                 
  WHERE repId= 9000 AND DATEADD(dd,0,DATEDIFF(dd,0,idate)) ='2013-08-25 00:00:00'
UNION ALL
SELECT  'csh' type, SUM(csh) Amount  FROM  sales                 
  WHERE repId= 9000 AND DATEADD(dd,0,DATEDIFF(dd,0,idate)) ='2013-08-25 00:00:00'
UNION ALL
SELECT  'chk' type, SUM(chk) Amount  FROM  sales                 
  WHERE repId= 9000 AND DATEADD(dd,0,DATEDIFF(dd,0,idate)) ='2013-08-25 00:00:00'
或者,使用CTE:

;WITH CTE(atm,cc,csh,chk) AS
   (SELECT  SUM(atm),SUM(cc),SUM(csh),SUM(chk) FROM sales                 
    WHERE repId= 9000 AND DATEADD(dd,0,DATEDIFF(dd,0,idate)) ='2013-08-25 00:00:00' )
SELECT  'atm' Type,atm Amount FROM CTE
UNION ALL SELECT 'cc' ,cc  FROM CTE
UNION ALL SELECT 'csh',csh FROM CTE
UNION ALL SELECT 'chk',chk FROM CTE

有比使用UNION ALL更好的方法吗?我认为没有,但是当您使用公共表表达式版本时,如上所示,三个
SELECT
s确实会给SQL server带来额外的工作。从理论上讲,
UNION ALL
UNION
便宜,但是,在本例中总共有三行,您肯定不会注意到任何差异,因此在本例中,您也可以使用
UNION