SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段值)【葡京网上娱乐场】

   一.本文所关联的剧情(Contents)

本文子禽基于三个已有的脚本工具自动导出全体的图样;最终交付的是2个从
Images.xcassets 到基于文件夹的洗练 合适
的图纸能源集的总体进度.难点在于从完整图片集到精简图片集,肯定是依照二个定制化的台本,自定义导出的.假诺自身手动导出?那可有个别忙喽~

  本文所涉及的始末(Contents)

Images.xcassets 与 Assets.car

Images.xcassets,是Xcode项目中的,用于存放财富文件.那么我们怎么不直接处理
Images.xcassets
呢?因为Images.xcassets中存放的图样名称或许与图片的能源名称不同,最后决定图片能源名的是资源文件夹的称号;也有或许Images.xcassets存放的是pdf格式的图形,那样能够活动预编译对应尺寸的图样财富.

Images.xcassets
编写翻译后,最后ipa包中,是以Assets.car包的花样出现的,内部是处理后的图纸名.此处的公文名与大家代码中引用的图形财富名称是同样的.

相当于说:
直接基于Assets.car实行处理,能够使大家的应用图片处的代码变更尽大概少.

  背景(Contexts)

运用 cartool 从 Assets.car 导出图片

Assets.car 不能直接zip解压,须求借助专门的工具,此处推荐:
cartool
使用办法,参见:
iOS学习之解压Assets.car

尽管你缺乏丰富复杂的Assets.car大概cartool用法万分,能够一贯利用作者处理过的财富:https://github.com/ios122/ios_assets_hot_update/tree/master/res

针对文章github给定的目录, cartool的用法,能够简述为:
cd 到 res目录,然后

mkdir Assets
./cartool  ./Assets.car ./Assets

  实现代码(SQL Codes)

事实上选取一张图纸就能够额包容摩托罗拉/surface

从 Assets.car 导出后的图片,大致有以下两种:

如上图片的来由,十分的大学一年级些是由于App迭代引起的.对于1个图纸,存在上述差异情状时,图片经常加载与当前显示屏比例(scale)最适合的图纸,具体细节下一篇小说会更完整描述.

通过自个儿要好的实验与网上各个材质的询问,使用 @3x 的图片是能够而且作为
酷派和苹果平板的通用图标的.当然,那是内需自定义
imageNamed方法,也是下一篇小说的重点.
2套共几个图片,今后只必要三个图片,理论图片能源体量能够削减
((1 + 2 + 3 + 3 + 1.5) – 3) / (1 + 2 + 3 + 3 + 1.5) = 71.428571 %
(信息量超大的快速总结法,看不懂就当是个冷笑话吧~(≧▽≦)/~)

  方法一:使用拼接SQL,静态列字段;

电动分类脚本思路

小编们想要获取的是
*可用的@3x图片文件夹*

*不含有@3x图片的有题目标财富列表*.
对于不存在@3x副本的图样,十分的大恐怕这一个资源已经被屏弃了.这一块,暂定手动去排查与核实.假如一个图纸仍在选取可是不设有@3x的副本,相对是帕杰罗D挖了二个坑,等你来填!

基本思路是:

  1. 去除 ~ipad 结尾的图片,如bg_mypage_edit~ipad.png;
  2. 去除 ~iphone 图片中的
    ~iphone文字,如bg_mypage_edit~iphone@3x.png
    重命名为 bg_mypage_edit@3x.png;
  3. 将涵盖@3x的图片组的@1x
    @2x @3x 的图样按梯次移动到独门文件夹 如
    assets_3x,并都命名为@3x,此时原版的书文件夹中即为有标题标能源,新文件夹中为使得的资源文件,且只保留了@3x;
  4. 将原财富文件夹命名为assets_error,以供未来选拔;
  5. 人为确认违规图片是或不是拥有存在意义,留存则寻找其@3x副本放到
    assets_3x 文件夹;

  方法二:使用拼接SQL,动态列字段;

活动分类脚本完毕

除开上述的第5步以外,前四步都得以自动化运转:

#0. 需要先cd到解压后的Assets目录;
#1. 去除 ~ipad 结尾的图片,如bg_mypage_edit~ipad.png;
find . -iname "*~ipad*.png" -delete

#2. 去除 ~iphone 图片中的 ~iphone文字;
find . -name "*~iphone.png" -exec sh -c 'for i do mv -- "$i" "${i%~iphone.png}.png"; done' sh {} +

find . -name "*~iphone@2x.png" -exec sh -c 'for i do mv -- "$i" "${i%~iphone@2x.png}@2x.png"; done' sh {} +

find . -name "*~iphone@3x.png" -exec sh -c 'for i do mv -- "$i" "${i%~iphone@3x.png}@3x.png"; done' sh {} +

# 3.将含有@3x的图片组的@1x @2x @3x 的图片按顺序移动到单独文件夹 如 assets_3x,并都命名为@3x,此时原文件夹中即为有问题的资源,新文件夹中为有效的资源文件,且只保留了@3x;

mkdir ../assets_3x

find . -name "*@3x.png" -exec sh -c 'for i do mv -- "${i%@3x.png}.png" "../assets_3x/${i%@3x.png}@3x.png"; mv -- "${i%@3x.png}@2x.png" "../assets_3x/${i%@3x.png}@3x.png";mv -- "${i%@3x.png}@3x.png" "../assets_3x/${i%@3x.png}@3x.png";done' sh {} +

# 4.将原资源文件夹命名为assets_error,以供以后使用;
cd ..
mv Assets assets_error

说到底赢得的 assets_3x 即为可用财富,assets_error
即为必要手动确承认用性的财富.

  方法三:使用PIVOT关系运算符,静态列字段;

取得与清醒:

  1. 类型中,图片这一块,的确有好多空头的或不客观的财富,要求赶紧化解;
  2. shell 脚本是基于路径举办复制,移动等操作的,如
    find的结果,其实是2个文书路径,借助它,建议了一个大致的区分可用于不可用能源的不二法门;
  3. 写博客,确实能够使思路更清楚有序,坦白讲,那自然是贰个自个儿不敢碰的优化职责,3个3个比对,想想都头大.最后的处理结果,依旧交给了肯定数额的失效图片,不过自个儿依据其名字就足以分明其职分,万分好处理了,已经省了诸多武功了;而且,要比作者手动排查地可信赖多了.

层层专属github地址: https://github.com/ios122/ios_assets_hot_update

  方法四:使用PIVOT关系运算符,动态列字段;

  二.背景(Contexts)

  其执行转列并不是多个如何特殊的话题了,甚至早已被世家说到烂了,网上的大队人马例证多有点少都多少标题,所以自身盼望能让大家急迅的看来举办的效益,所以在动态列的根底上再把表、分组字段、行转列字段、值那多个行转列固定要求的值变成真的意义的参数化,大家只供给基于本人的条件,设置参数值,霎时就能阅览效果了(能够直接跳转至:“参数化动态PIVOT行转列”查看具体的脚本代码)。行转列的功效图如图1所示:

葡京网上娱乐场 1

  (图1:行转列效果图)

  三.兑现代码(SQL Codes)

  (一)
首先我们先创设二个测试表,往里面插入测试数据,重回表记录如图2所示:

  –创立测试表

  IF EXISTS (SELECT * FROM sys.objects WHERE object_id =
OBJECT_ID(N'[dbo].[TestRows2Columns]’) AND type in (N’U’))

  DROP TABLE [dbo].[TestRows2Columns]

  GO

  CREATE TABLE [dbo].[TestRows2Columns](

  [Id] [int] IDENTITY(1,1) NOT NULL,

  [UserName] [nvarchar](50) NULL,

  [Subject] [nvarchar](50) NULL,

  [Source] [numeric](18, 0) NULL

  ) ON [PRIMARY]

  GO

  –插入测试数据

  INSERT INTO [TestRows2Columns]
([UserName],[Subject],[Source])

  SELECT N’张三’,N’语文’,60 UNION ALL

  SELECT N’李四’,N’数学’,70 UNION ALL

  SELECT N’王五’,N’英语’,80 UNION ALL

  SELECT N’王五’,N’数学’,75 UNION ALL

  SELECT N’王五’,N’语文’,57 UNION ALL

  SELECT N’李四’,N’语文’,80 UNION ALL

  SELECT N’张三’,N’英语’,100

  GO

  SELECT * FROM [TestRows2Columns]

葡京网上娱乐场 2

  (图2:样本数量)

  (二) 先以静态的方法贯彻行转列,效果如图3所示:

  –1:静态拼接行转列

  SELECT [UserName],

  SUM(CASE [Subject] WHEN ‘数学’ THEN [Source] ELSE 0 END) AS
‘[数学]’,

  SUM(CASE [Subject] WHEN ‘英语’ THEN [Source] ELSE 0 END) AS
‘[英语]’,

  SUM(CASE [Subject] WHEN ‘语文’ THEN [Source] ELSE 0 END) AS
‘[语文]’

  FROM [TestRows2Columns]

  GROUP BY [UserName]

  GO

葡京网上娱乐场 3

  (图3:样本数量)

  (三)
接着以动态的艺术完成行转列,那是应用拼接SQL的不二法门贯彻的,所以它适用于SQL
Server 3000之上的数据库版本,执行脚本重返的结果如图2所示;

  –2:动态拼接行转列

  DECLARE @sql VARCHAR(8000)

  SET @sql = ‘SELECT [UserName],’

  SELECT @sql = @sql + ‘SUM(CASE [Subject] WHEN ”’+[Subject]+”’
THEN [Source] ELSE 0 END) AS ”’+QUOTENAME([Subject])+”’,’

  FROM (SELECT DISTINCT [Subject] FROM [TestRows2Columns]) AS a

  SELECT @sql = LEFT(@sql,LEN(@sql)-1) + ‘ FROM [TestRows2Columns]
GROUP BY [UserName]’

  PRINT(@sql)

  EXEC(@sql)

  GO

  (四) 在SQL Server 二零零五自此有了二个专程的PIVOT 和 UNPIVOT
关系运算符做行列之间的变换,下边是静态的不二法门贯彻的,完成效益如图4所示:

  –3:静态PIVOT行转列

  SELECT *

  FROM ( SELECT [UserName] ,

  [Subject] ,

  [Source]

  FROM [TestRows2Columns]

  ) p PIVOT

  ( SUM([Source]) FOR [Subject] IN ( [数学],[英语],[语文] )
) AS pvt

  ORDER BY pvt.[UserName];

  GO

葡京网上娱乐场 4

  (图4)

  (五)
把上边静态的SQL基础上进展改动,那样就无须理会记录里面储存了哪些,须要转成什么列名的标题了,脚本如下,效果如图4所示:

  –4:动态PIVOT行转列

  DECLARE @sql_str VARCHAR(8000)

  DECLARE @sql_col VARCHAR(8000)

  SELECT @sql_col = ISNULL(@sql_col + ‘,’,”) +
QUOTENAME([Subject]) FROM [TestRows2Columns] GROUP BY [Subject]

  SET @sql_str = ‘

  SELECT * FROM (

  SELECT [UserName],[Subject],[Source] FROM
[TestRows2Columns]) p PIVOT

  (SUM([Source]) FOR [Subject] IN ( ‘+ @sql_col +’) ) AS pvt

  ORDER BY pvt.[UserName]’

  PRINT (@sql_str)

  EXEC (@sql_str)

  (六)
只怕很几人到了上边一步就够了,可是你会发觉,当别人获得您的代码,需求不停的修改成他自个儿条件中表名、分组列、行转列字段、字段值那多少个参数,逻辑如图5所示,所以,作者一而再对地点的台本进行修改,你一旦设置本人的参数就足以兑现行反革命转列了,效果如图4所示:

  –5:参数化动态PIVOT行转列

  – =============================================

  – Author: <听风吹雨>

  – Create date: <2014.05.26>

  – Description: <参数化动态PIVOT行转列>

  – Blog:

  – =============================================

  DECLARE @sql_str NVARCHAR(MAX)

  DECLARE @sql_col NVARCHAR(MAX)

  DECLARE @tableName SYSNAME –行转列表

  DECLARE @groupColumn SYSNAME –分组字段

  DECLARE @row2column SYSNAME –行变列的字段

  DECLARE @row2columnValue SYSNAME –行变列值的字段

  SET @tableName = ‘TestRows2Columns’

  SET @groupColumn = ‘UserName’

  SET @row2column = ‘Subject’

  SET @row2columnValue = ‘Source’

  –从行数据中得到大概存在的列

  SET @sql_str = N’

  SELECT @sql_col_out = ISNULL(@sql_col_out + ”,”,””) +
QUOTENAME([‘+@row2column+’])

  FROM [‘+@tableName+’] GROUP BY [‘+@row2column+’]’

  –PRINT @sql_str

  EXEC sp_executesql @sql_str,N’@sql_col_out NVARCHAR(MAX)
OUTPUT’,@sql_col_out=@sql_col OUTPUT

  –PRINT @sql_col

  SET @sql_str = N’

  SELECT * FROM (

  SELECT
[‘+@groupColumn+’],[‘+@row2column+’],[‘+@row2columnValue+’] FROM
[‘+@tableName+’]) p PIVOT

  (SUM([‘+@row2columnValue+’]) FOR [‘+@row2column+’] IN ( ‘+
@sql_col +’) ) AS pvt

  ORDER BY pvt.[‘+@groupColumn+’]’

  –PRINT (@sql_str)

  EXEC (@sql_str)

葡京网上娱乐场 5

  (图5)

  (七)
在其实的施用中,小编时常境遇供给对基础表的数目举办筛选后再展开发银行转列,那么上边包车型大巴本子将满意你那个须求,效果如图6所示:

  –6:带条件查询的参数化动态PIVOT行转列

  – =============================================

  – Author: <听风吹雨>

  – Create date: <2014.05.26>

  – Description:
<参数化动态PIVOT行转列,带条件查询的参数化动态PIVOT行转列>

  – Blog:

  – =============================================

  DECLARE @sql_str NVARCHAR(MAX)

  DECLARE @sql_col NVARCHAR(MAX)

  DECLARE @sql_where NVARCHAR(MAX)

  DECLARE @tableName SYSNAME –行转列表

  DECLARE @groupColumn SYSNAME –分组字段

  DECLARE @row2column SYSNAME –行变列的字段

  DECLARE @row2columnValue SYSNAME –行变列值的字段

  SET @tableName = ‘TestRows2Columns’

  SET @groupColumn = ‘UserName’

  SET @row2column = ‘Subject’

  SET @row2columnValue = ‘Source’

  SET @sql_where = ‘WHERE UserName = ”王五”’

  –从行数据中取得也许存在的列

  SET @sql_str = N’

  SELECT @sql_col_out = ISNULL(@sql_col_out + ”,”,””) +
QUOTENAME([‘+@row2column+’])

  FROM [‘+@tableName+’] ‘+@sql_where+’ GROUP BY
[‘+@row2column+’]’

  –PRINT @sql_str

  EXEC sp_executesql @sql_str,N’@sql_col_out NVARCHAR(MAX)
OUTPUT’,@sql_col_out=@sql_col OUTPUT

  –PRINT @sql_col

  SET @sql_str = N’

  SELECT * FROM (

  SELECT
[‘+@groupColumn+’],[‘+@row2column+’],[‘+@row2columnValue+’] FROM
[‘+@tableName+’]’+@sql_where+’) p PIVOT

  (SUM([‘+@row2columnValue+’]) FOR [‘+@row2column+’] IN ( ‘+
@sql_col +’) ) AS pvt

  ORDER BY pvt.[‘+@groupColumn+’]’

  –PRINT (@sql_str)

  EXEC (@sql_str)

葡京网上娱乐场 6

  (图6)

  转自:http://www.cnblogs.com/gaizai/p/3753296.html