如何将水平行转换为垂直行

Posted

技术标签:

【中文标题】如何将水平行转换为垂直行【英文标题】:How to convert horizontal row into vertical 【发布时间】:2016-04-07 01:43:25 【问题描述】:

我有一个动态查询,它在 sql 中获取一行 62 列

查询是这样的

DECLARE @SQLQuery AS nvarchar(max)

DECLARE @columns nvarchar(max)

SELECT
  @columns = ISNULL(@columns + ', ', '') + QUOTENAME(Column_name)
FROM (SELECT
  Column_name
FROM
 (SELECT
  Column_name,
  ROW_NUMBER() OVER (PARTITION BY Column_name ORDER BY Column_name) AS Rows
FROM information_Schema.Columns

WHERE Table_Name IN ('Parking', 'AIV_Parking')
AND column_name NOT IN ('IssueNo', 'Issuedate', 'Agency', 'OfficerName', 'OfficerId', 'Beat', 'UNITSERIAL', 'VEHLICNO', 'VEHLICSTATE', 'VEHLICEXPDATE', 'VEHLICTYPE', 'VEHMAKE',
'VEHMODEL', 'VEHBODYSTYLE', 'VEHVIN4', 'VEHVIN', 'ISSUENOCHKDGT', 'VEHCOLOR1', 'VEHCOLOR2', 'PERMITNO', 'VEHLABELNO', 'LOCBLOCK', 'LOCSTREET', 'LOCDESCRIPTOR', 'LOCTRAVELDIR', 'LOCSIDEOFSTREET',
'LOCSUBURB', 'LOCLOT', 'LOCCROSSSTREET1', 'LOCCROSSSTREET2', 'LOCSTATE', 'LOCPOSTALCODE', 'METERNO', 'METERBAYNO', 'REMARK1', 'REMARK2')) p
WHERE Rows = 2) RequiredColumns

EXEC ('SELECT ' + @columns + '  FROM AIV_Parking Where  Issueno =''100000600''')

这给了我以下记录

所以结果如下所示,我一次只能得到 1 行。

|ACTLINE1  |    ACTLINE2 |   AUTOPROC_UNIQUEKEY |   COURTADDR|  IssueNo|.......

 |SUBIACO  |   LOCAL LAWS|       NULL            |      NULL |    123 |

现在我希望将其转换为:

|FieldName       |                                    FieldValue

|ACTLINE1        |                                      SUBIACO  

|ACTLINE2        |                                      LOCAL LAWS 

|ISSUENO         |                                      123

在旋转这些列时,我只想要那些具有值的列,我不想要那些值为空或''的列

【问题讨论】:

【参考方案1】:

您需要使用UNION ALL 并使用WHERE 子句过滤结果:

DECLARE @SQLQuery AS NVARCHAR(MAX) = ''

SELECT @SQLQuery = @SQLQuery +
'SELECT ''' + COLUMN_NAME + ''' AS FieldName, CAST(' + QUOTENAME(COLUMN_NAME)  + ' AS NVARCHAR(MAX)) AS FieldValue 
FROM AIV_Parking 
WHERE Issueno =''100000600'' 
UNION ALL' + CHAR(10)
--QUERY HERE TO GET COLUMNS FROM INFORMATION_SCHEMA.COLUMNS
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME IN('Parking','AIV_Parking')

IF @SQLQuery <> '' BEGIN
    -- Remove the last occurence of UNION ALL
    SELECT @SQLQuery = LEFT(@SQLQuery, LEN(@SQLQuery) - 11)

    SELECT @SQLQuery = 
    'SELECT * FROM (' + @SQLQuery + ') t WHERE FieldValue IS NOT NULL AND FieldValue <> '''''

    EXEC(@SQLQuery)
END

请注意,您需要将CAST 您的FieldValue 转换为NVARCHAR(MAX) 或任何不会产生转换错误的数据类型。这是因为在使用UNION 时,所有列必须具有相同的数据类型,否则将转换为具有更高数据类型优先级的列。

【讨论】:

感谢您的回复。但它不起作用,当我插入查询以获取列时,它不起作用 让我看看你的问题!你确定你插入的查询是正确的吗? 我正在使用您的查询但我认为我犯了一些错误。我首先尝试获取所有列及其垂直格式的值:SELECT 'ISSUENO' AS FieldName, CAST(QUOTENAME(ISSUENO ) AS NVARCHAR(MAX)) AS FieldValue FROM AIV_Parking WHERE Issueno ='100000600' UNION ALL Select Column_name,CAST(QUOTENAME(Column_name) AS NVARCHAR(MAX)) AS FieldValue from information_Schema.Columns Where Table_Name in ('Parking','AIV_Parking ') @Khushboo,您插入了错误的查询。让我编辑我的答案。 @Khushboo,那里。请参阅我的更新答案。您可以直接运行我的整个答案。

以上是关于如何将水平行转换为垂直行的主要内容,如果未能解决你的问题,请参考以下文章

从垂直行中选择记录并转换水平行

查找多个刷入/刷出时间戳之间的总分钟数 - 从垂直行中选择多个记录并转换水平行

将自定义 CSS 导航栏从水平转换为垂直

带有 IntputLabel 和 Input 的 Material UI 网格放置在水平行中:如何要求垂直对齐位于标签的中间?

html中怎么插入垂直线

unity的平行光有啥办法可以只照射一些区域