sql-server - 项目查询结果列

标签 sql-server pivot azure-sql-database projection

我有一个相对简单的连接,它从各种表中提取数据

SELECT P.StoreName AS Store, CR.Model AS Terminal, T.TxType, COUNT(*) as Total
  FROM [SVTx] SVCT
       INNER JOIN [Txs] T ON T.TransactionID = SVCT.transactionID
       INNER JOIN [TxIss] TI ON TI.TransactionID = T.transactionID
       INNER JOIN [Stores] P ON P.[ExtStoreID] = TI.[ExtStoreID]
       INNER JOIN [Terms] CR ON CR.[StoreID] = P.StoreID AND CR.[ExtTermCode] = TI.[ExtTermCode]
       INNER JOIN [SVCrd] SVC ON SVC.SVCrdID = SVCT.SVCrdID
GROUP BY P.StoreName, CR.Model, TxType
ORDER BY P.StoreName, CR.Model, TxType

并产生如下结果

Store     Terminal     TransactionType     Total
-------   ----------   -----------------   -----------
Store 1   Terminal 1   1                   23
Store 1   Terminal 1   2                   17
Store 1   Terminal 2   1                   28
Store 1   Terminal 2   2                   24
...       ...          ...                  ..

这为我提供了每个商店和终端的任何给定类型的交易数量。

我想修改我的查询以添加任何给定商店/终端进行的总交易并将结果转换到列而不是行中。 要有一个想法,请看下面的例子:

Store     Terminal     1        2       Total
-------   ----------   -----    -----   -------
Store 1   Terminal 1   23       17      40
Store 1   Terminal 2   28       24      52

我已经阅读了 PIVOT功能,但我只能在使用 Azure SQL 数据库(SQL Server 2014 兼容级别)时找到 SQL Server 2008 的帮助。

有什么帮助吗?

最佳答案

改用条件聚合

;WITH cte 
     AS (SELECT p.storename AS Store, 
                cr.model    AS Terminal, 
                t.txtype, 
                Count(*)    AS Total 
         FROM   [svtx] SVCT
            INNER JOIN [Txs] ...),
     intr 
     AS (SELECT store, 
                terminal, 
                Coalesce(Max(CASE WHEN transactiontype = 1 THEN total END),0)   AS [1], 
                Coalesce(Max(CASE WHEN transactiontype = 2 THEN total END),0)   AS [2], 
                Sum(total) AS total 
         FROM   cte 
         GROUP  BY store, 
                   terminal) 
SELECT store, 
       terminal, 
       [1], 
       [2], 
       total, 
       ( [1] / Cast(total AS NUMERIC(22, 6)) ) * 100 AS percent1, 
       ( [2] / Cast(total AS NUMERIC(22, 6)) ) * 100 AS percent2 
FROM   intr 

关于sql-server - 项目查询结果列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34235712/

相关文章:

azure - 如何更改 sql azure 服务器位置

使用 datetimeoffset 时 SQL Server 行为发生变化

c# - 从 DataTable 创建 Excel 数据透视表

sql - 如何将外键约束添加到表 A (id, type) 引用两个表表 B (id, type) 或表 C (id, 类型) 中的任何一个?

sql - 使用 PIVOT 将数据从宽翻转到高

python - Pandas Dataframe 中的透视行

sql-server - 在 Azure SQL 数据库之间使用托管标识进行数据库到数据库查询

sql-server - PK 和唯一约束

sql - 如何通过注册表查找sql​​ server实例的版本和版本

sql-server - 将多行转换为具有指定标题的列