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
。