• 首页
  • 欧博官网代理
  • 欧博博彩
  • 欧博在线官网
  • 欧博正网注册
  • 欧博百家乐
  • 欧博娱乐官网
  • 欧博娱乐开户
  • 欧博平台
  • 欧博体育投注
  • 你的位置:欧博真人博彩 > 欧博博彩 > 亚博三公网站注册流程问题_SQL 中的行转列和列转行

    亚博三公网站注册流程问题_SQL 中的行转列和列转行

    发布日期:2023-10-30 06:09    点击次数:157

    亚博三公网站注册流程问题_SQL 中的行转列和列转行

    亚博三公网站注册流程问题_

     香港六合彩捕鱼行转列,列转行是咱们在招引经由中频繁遭逢的问题。行转列一般通过CASE WHEN 语句来罢了,也不错通过 SQL SERVER 的运算符PIVOT来罢了。用传统的重要香港六合彩捕鱼,相比好结实。档次涌现,况兼相比习尚。 然则PIVOT 、UNPIVOT提供的语法比一系列复杂的SELECT…CASE 语句中所指定的语法更冒昧、更具可读性。底下咱们通过几个冒昧的例子来先容一下列转行、行转列问题。

    [[433974]]

    咱们最初先通过一个须生常谭的例子,学生收货表(底下简化了些)来形象了解下行转列

    皇冠客服飞机:@seo3687

    太平洋百家乐皇冠盘口瀚希体育bet365下载以安全、稳定博彩平台丰富、多样化博彩游戏赛事直播,广大博彩爱好者带来最佳博彩体验最高博彩收益。皇冠体育注册送彩金体育赛事亚博三公网站注册流程问题

     

    这话还真没错,一个女人如果嫁错了人,尤其碰到的还是地痞无赖,那日子能过好?

    CREATE  TABLE [StudentScores] (   [UserName]         NVARCHAR(20),        --学生姓名    [Subject]          NVARCHAR(30),        --科目    [Score]            FLOAT,               --收货 )  INSERT INTO [StudentScores] SELECT 'Nick', '语文', 80 INSERT INTO [StudentScores] SELECT 'Nick', '数学', 90 INSERT INTO [StudentScores] SELECT 'Nick', '英语', 70 INSERT INTO [StudentScores] SELECT 'Nick', '生物', 85 INSERT INTO [StudentScores] SELECT 'Kent', '语文', 80 INSERT INTO [StudentScores] SELECT 'Kent', '数学', 90 INSERT INTO [StudentScores] SELECT 'Kent', '英语', 70 INSERT INTO [StudentScores] SELECT 'Kent', '生物', 85 

    如果我思知谈每位学生的每科收货,况兼每个学生的一谈收货排成一转,这样肤浅我检察、统计,导出数据

     

    SELECT      UserName,      MAX(CASE Subject WHEN '语文' THEN Score ELSE 0 END) AS '语文',      MAX(CASE Subject WHEN '数学' THEN Score ELSE 0 END) AS '数学',      MAX(CASE Subject WHEN '英语' THEN Score ELSE 0 END) AS '英语',      MAX(CASE Subject WHEN '生物' THEN Score ELSE 0 END) AS '生物' FROM dbo.[StudentScores] GROUP BY UserName 

     

    查询效果如图所示,这样咱们就能很了了的了解每位学生通盘的收货了

     

     

    接下来咱们来望望第二个小列子。有一个游戏玩家充值表(只是为了评释,举的一个小例子),

     

     

     

    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 

    如图所示,咱们这样只是获取了这样的输出效果,还需进一步处理,能力获取思要的效果

     

     

     

     

     

    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 

    其实行转列,重要是要理清逻辑,况兼对分组(Group by)见地相比涌现。上头两个列子基本上等于行转列的类型了。然则有个问题来了,上头是我为了评释弄的一个冒昧列子。骨子中,欧博在线官网可能支付花式特别多,况兼逻辑也复杂好多,可能触及汇率、手续费等等(仍是作念个这样一个),如果支付花式特别多,咱们的CASE WHEN 会弄出一大堆,照实相比恼火,况兼新增一种支付花式,咱们还得修改剧本如果把上头的剧本用动态SQL改写一下,咱们就能放纵惩处这个问题

     

    DECLARE @cmdText    VARCHAR(8000); DECLARE @tmpSql        VARCHAR(8000); SET @cmdText = 'SELECT CONVERT(VARCHAR(10), CreateTime, 120) AS CreateTime,' + CHAR(10); SELECT @cmdText = @cmdText + ' CASE PayType WHEN ''' + PayType + ''' THEN SUM(Money) ELSE 0 END AS ''' + PayType       + ''',' + CHAR(10)  FROM (SELECT DISTINCT PayType FROM Inpours ) T  SET @cmdText = LEFT(@cmdText, LEN(@cmdText) -2) --凝视这里,如果莫得加CHAR(10) 则用LEFT(@cmdText, LEN(@cmdText) -1)  SET @cmdText = @cmdText + ' FROM Inpours        GROUP BY CreateTime, PayType ';  SET @tmpSql ='SELECT CreateTime,' + CHAR(10); SELECT @tmpSql = @tmpSql + ' ISNULL(SUM(' + PayType  + '), 0) AS ''' + PayType  + ''','  + CHAR(10) FROM  (SELECT DISTINCT PayType FROM Inpours ) T  SET @tmpSql = LEFT(@tmpSql, LEN(@tmpSql) -2) + ' FROM (' + CHAR(10);  SET @cmdText = @tmpSql + @cmdText + ') T GROUP BY CreateTime '; PRINT @cmdText EXECUTE (@cmdText); 

    底下是通过PIVOT来进行行转列的用法,民众不错对比一下,照实要冒昧、更具可读性

     

    SELECT CreateTime, [支付宝] , [手机短信],[工商银行卡] , [修复银行卡] FROM (    SELECT CONVERT(VARCHAR(10), CreateTime, 120) AS CreateTime,PayType, Money    FROM Inpours ) P PIVOT (            SUM(Money)            FOR PayType IN            ([支付宝], [手机短信], [工商银行卡], [修复银行卡])      ) AS T ORDER BY CreateTime 

    随机可能会出现这样的造作:

    音书 325,级别 15,景色 1,第 9 行

    ‘PIVOT’ 近邻有语法造作。您可能需要将面前数据库的兼容级别建立为更高的值,以启用此功能。相干存储经由 sp_dbcmptlevel 的信息,请参见匡助。

    这个是因为:对升级到 SQL Server 2005 或更高版块的数据库使用 PIVOT 和 UNPIVOT 时,必须将数据库的兼容级别建立为 90 或更高。相干怎样建立数据库兼容级别的信息,请参阅 sp_dbcmptlevel (Transact-SQL)。 举例,只需在实行上头剧本前加上 EXEC sp_dbcmptlevel Test, 90; 就OK了, Test 是场地数据库的称号。

    万博官网

    底下咱们来望望列转行,主淌若通过UNION ALL ,MAX来罢了。假如有底下这样一个表

     

    Create Table ProgrectDetail (    ProgrectName         NVARCHAR(20), --工程称号    OverseaSupply        INT,          --国外供应商供给数目    NativeSupply         INT,          --国内供应商供给数目    SouthSupply          INT,          --南边供应商供给数目    NorthSupply          INT           --朔方供应商供给数目 )  INSERT INTO ProgrectDetail SELECT 'A', 100, 200, 50, 50 UNION ALL SELECT 'B', 200, 300, 150, 150 UNION ALL SELECT 'C', 159, 400, 20, 320 UNION ALL SELECT 'D', 250, 30, 15, 15 

    咱们不错通过底下的剧原本罢了,查询效果如下图所示

     

    SELECT  ProgrectName, 'OverseaSupply' AS Supplier,       MAX(OverseaSupply) AS 'SupplyNum' FROM ProgrectDetail GROUP BY ProgrectName UNION ALL SELECT ProgrectName, 'NativeSupply' AS Supplier,        MAX(NativeSupply) AS 'SupplyNum' FROM ProgrectDetail GROUP BY ProgrectName UNION ALL SELECT ProgrectName, 'SouthSupply' AS Supplier,        MAX(SouthSupply) AS 'SupplyNum' FROM ProgrectDetail GROUP BY ProgrectName UNION ALL SELECT ProgrectName, 'NorthSupply' AS Supplier,        MAX(NorthSupply) AS 'SupplyNum' FROM ProgrectDetail GROUP BY ProgrectName 

     

     

     

    用UNPIVOT 罢了如下:

     

    皇冠体育hg86a

    SELECT ProgrectName,Supplier,SupplyNum FROM   (    SELECT ProgrectName, OverseaSupply, NativeSupply,           SouthSupply, NorthSupply     FROM ProgrectDetail )T UNPIVOT   (    SupplyNum FOR Supplier IN    (OverseaSupply, NativeSupply, SouthSupply, NorthSupply ) ) P 

     



    上一篇:没有了

    相关资讯