加入收藏 | 设为首页 | 会员中心 | 我要投稿 佛山站长网 (https://www.0757zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQL中行转列和列转行

发布时间:2016-09-30 22:31:11 所属栏目:MsSql教程 来源:网络整理
导读:行转列,列转行是我们在开发过程中经常碰到的问题。行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现。用传统的方法

接下来我们来看看第二个小列子。有一个游戏玩家充值表(仅仅为了说明,举的一个小例子),

CREATE TABLE [Inpours]
   
(
   
   [ID]                INT IDENTITY(1,1), 
   
   [UserName]          NVARCHAR(20),  --游戏玩家
   
    [CreateTime]        DATETIME,      --充值时间    
   
    [PayType]           NVARCHAR(20),  --充值类型    
   
    [Money]             DECIMAL,       --充值金额
   
    [IsSuccess]         BIT,           --是否成功 1表示成功, 0表示失败
   
    CONSTRAINT [PK_Inpours_ID] PRIMARY KEY(ID)
   
)
   
    
   
INSERT INTO Inpours SELECT '张三', '2010-05-01', '支付宝', 50, 1
   
    
   
INSERT INTO Inpours SELECT '张三', '2010-06-14', '支付宝', 50, 1
   
    
   
INSERT INTO Inpours SELECT '张三', '2010-06-14', '手机短信', 100, 1
   
    
   
INSERT INTO Inpours SELECT '李四', '2010-06-14', '手机短信', 100, 1
   
    
   
INSERT INTO Inpours SELECT '李四', '2010-07-14', '支付宝', 100, 1
   
    
   
INSERT INTO Inpours SELECT '王五', '2010-07-14', '工商银行卡', 100, 1
   
    
   
INSERT INTO Inpours SELECT '赵六', '2010-07-14', '建设银行卡', 100, 1

下面来了一个统计数据的需求,要求按日期、支付方式来统计充值金额信息。这也是一个典型的行转列的例子。我们可以通过下面的脚本来达到目的

SELECT CONVERT(VARCHAR(10), CreateTime, 120) AS CreateTime,
       CASE PayType WHEN '支付宝'     THEN SUM(Money) ELSE 0 END AS '支付宝',
       CASE PayType WHEN '手机短信'    THEN SUM(Money) ELSE 0 END AS '手机短信',
       CASE PayType WHEN '工商银行卡'  THEN SUM(Money) ELSE 0 END AS '工商银行卡',
       CASE PayType WHEN '建设银行卡'  THEN SUM(Money) ELSE 0 END AS '建设银行卡'
FROM Inpours
GROUP BY CreateTime, PayType

更多精彩内容:http://www.bianceng.cn/database/SQLServer/

如图所示,我们这样只是得到了这样的输出结果,还需进一步处理,才能得到想要的结果

SQL中行转列和列转行

SELECT
   
       CreateTime, 
   
       ISNULL(SUM([支付宝])    , 0)  AS [支付宝]    , 
   
       ISNULL(SUM([手机短信])  , 0)  AS [手机短信]   , 
   
       ISNULL(SUM([工商银行卡]), 0)  AS [工商银行卡] ,  
   
       ISNULL(SUM([建设银行卡]), 0)  AS [建设银行卡]
   
FROM
   
(
   
    SELECT CONVERT(VARCHAR(10), CreateTime, 120) AS CreateTime,
   
           CASE PayType WHEN '支付宝'     THEN SUM(Money) ELSE 0 END AS '支付宝' ,
   
           CASE PayType WHEN '手机短信'   THEN SUM(Money) ELSE 0 END AS '手机短信',
   
           CASE PayType WHEN '工商银行卡' THEN SUM(Money) ELSE 0 END AS '工商银行卡',
   
           CASE PayType WHEN '建设银行卡' THEN SUM(Money) ELSE 0 END AS '建设银行卡'
   
    FROM Inpours
   
    GROUP BY CreateTime, PayType
   
) T
   
GROUP BY CreateTime

(编辑:佛山站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读