如何将水平行转换为垂直行
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,那里。请参阅我的更新答案。您可以直接运行我的整个答案。以上是关于如何将水平行转换为垂直行的主要内容,如果未能解决你的问题,请参考以下文章
查找多个刷入/刷出时间戳之间的总分钟数 - 从垂直行中选择多个记录并转换水平行
带有 IntputLabel 和 Input 的 Material UI 网格放置在水平行中:如何要求垂直对齐位于标签的中间?