#sql #sql-server #sql-server-2005 #tsql #sql-server-2008
#sql #sql-сервер #sql-server-2005 #tsql #sql-server-2008
Вопрос:
в моей таблице есть два столбца columnname и data
я выдаю простой sql like select * from mytable
затем данные отображаются как
colname data
------------------- -----------
JID 41185
WID 0
AccountReference LH169
OEReference Ari002
InvoiceNumber 0
но я хочу отображать данные по-другому, например
JID WID AccountReference OEReference InvoiceNumber
41185 0 LH169 Ari002 0
если мне нужно отображать данные по горизонтали, то какой sql мне нужно выдать………. пожалуйста, помогите.
Комментарии:
1. Где вы выполняете
select
инструкцию? SQL Server Management Studio?
Ответ №1:
SQL на самом деле не предназначен для отображения. Проблема в том, что вам действительно понадобятся 2 запроса (1 для colname и 1 для data) без гарантии, что данные будут возвращены в том же порядке для каждого запроса. Вам действительно нужно обернуть вокруг этого некоторый внешний код — сохраните результаты запроса в двумерном массиве строк (или коллекции и т.д.), Затем выполните итерацию по каждому
Ответ №2:
SELECT JID,WID,AccountReference,OEReference,InvoiceNumber
FROM
(
SELECT colname, data FROM YourTableName
)
p
PIVOT
(
Max(data) FOR colname
IN ([JID],[WID],[AccountReference],[OEReference],[InvoiceNumber])
) AS pvt
вы можете попробовать приведенные ниже ссылки. содержит руководства по использованию Pivot.
Комментарии:
1. Впервые я услышал о Pivot — спасибо. Доступно ли это в чем-либо другом, кроме MQ SQLServer 2005? Мой google-fu терпит неудачу
2. Если вы говорите о 2008, то да
3. Извините, я знаю только MS Sql server. 🙂
4. @Wudang — Это также поддерживается Oracle
5. почему здесь используется функция Max ().
Ответ №3:
Если значения colname
известны заранее и уникальны;
SELECT * FROM tbl
PIVOT (
MAX(data)
FOR colname in ([JID],[WID],[AccountReference],[OEReference],[InvoiceNumber])
) pv
Ответ №4:
Вы можете найти это в моем блоге:http://sql-tricks.blogspot.com/2011/04/sql-server-rows-transpose.html
Вы должны изменить переменную @xml следующим образом:
SET @xml = ( SELECT colname,data,
Row_Number() OVER ( ORDER BY ( SELECT 1
) ) Rn
FROM mytable
FOR
XML PATH('Row') ,
ROOT('Root') ,
ELEMENTS XSINIL
) ;