Транспонируйте ряд строк как столбцы в SQL Server 2000

В общем, вы правы, диалог может загружаться время, но обычно процесс занимает небольшую часть времени, и пользователь не должен видеть никакого времени «загрузки».

Это возможно, только если ваш диалог также загружает данные асинхронно.

Если вы действительно хотите предоставить графическую обратную связь пользователю, вы можете сделать это следующим образом:

onOpenDialog : function () {
    var oView = this.getView();

    // create dialog lazily
    if (!this.byId("helloDialog")) {]
        // set the view to busy state
        oView.setBusy(true);
        // load asynchronous XML fragment
        Fragment.load({
            id: oView.getId(),
            name: "sap.ui.demo.walkthrough.view.HelloDialog"
        }).then(function (oDialog) {
            // remove the busy state
            oView.setBusy(false);
            // connect dialog to the root view of this component (models, lifecycle)
            oView.addDependent(oDialog);
            oDialog.open();
        });
    } else {
        this.byId("helloDialog").open();
    }
}
8
задан Taryn 15 December 2014 в 13:46
поделиться

5 ответов

Пример по http://jdixon.dotnetdevelopersjournal.com/pivot_table_data_in_sql_server_2000_and_2005.htm только работает, если Вы знаете заранее, каковы значения строки могут быть. Например, скажем, у Вас есть объект с пользовательскими атрибутами, и пользовательские атрибуты реализованы как строки в дочерней таблице, где дочерняя таблица является в основном парами переменной/значения, и те пары переменной/значения настраиваются.

color red
size  big
city  Chicago

Я собираюсь описать технику, которая работает. Я использовал его. Я НЕ продвигаю его, но это работает.

Для поворота данных, где Вы не знаете то, чем значения могут быть заранее составьте временную таблицу на лету без столбцов. Затем используйте курсор для цикличного выполнения через строки, выходить динамично созданный "изменяет таблицу" для каждой переменной, так, чтобы в конце временная таблица имела столбцы, цвет, размер, город.

Затем Вы вставляете одну строку в свою временную таблицу, обновляете ее через другой курсор через переменную, оцениваете пар и затем выбираете ее, обычно присоединяемый с ее родительским объектом, в действительности заставляя ее казаться, что те пользовательские пары переменной/значения были похожи на встроенные столбцы в исходном родительском объекте.

3
ответ дан 5 December 2019 в 22:21
поделиться

Описанный метод курсора, вероятно, наименее подобен SQL для использования. Как упомянуто, SQL 2005 и на имеет ЦЕНТР, который работает отлично. Но для более старых версий и SQL-серверов неMS, метода Rozenshtein от "Transact-SQL Optimzing" (редактирование: распроданный, но польза. из Amazon: http://www.amazon.com/Optimizing-Transact-SQL-Advanced-Programming-Techniques/dp/0964981203), превосходно для поворота и неповорота данных. Это использует характеристики точки для превращения находящихся на строке данных в столбцы. Rozenshtein описывает несколько случаев, вот один пример:

SELECT
    RowValueNowAColumn = 
       CONVERT(varchar,
           MAX(
          SUBSTRING(myTable.MyVarCharColumn,1,DATALENGTH(myTable.MyVarCharColumn)
       * CHARINDEX(sa.SearchAttributeName,'MyRowValue'))))
FROM
    myTable

Этот метод намного более эффективен, чем использование операторов выбора и работает на множество типов данных и реализаций SQL (не только MS SQL).

2
ответ дан 5 December 2019 в 22:21
поделиться

Для UNPIVOT в sql server 2005 я нашел хорошую статью

столбцы-строки-в-sql-сервере

0
ответ дан 5 December 2019 в 22:21
поделиться

Лучше всего ограничиться небольшим масштабом для такого рода вещей. Если вы используете SQL 2k и у вас нет доступных функций PIVOT, я подготовил сохраненную процедуру, которая должна выполнить эту работу за вас. Немного неудачная работа, так что разбирайте ее сколько угодно. Вставьте приведенное ниже в окно sql и отредактируйте EXEC внизу по своему усмотрению. Если вы хотите увидеть, что сгенерировано, удалите --s посередине:

IF EXISTS (SELECT * FROM SYSOBJECTS WHERE XTYPE = 'P' AND NAME = 'USP_LIST_CONCAT')
DROP PROCEDURE USP_LIST_CONCAT
GO

CREATE PROCEDURE USP_LIST_CONCAT (@SourceTable NVARCHAR(1000) = '' ,@SplitColumn NVARCHAR(1000) = '' , @Deli NVARCHAR(10) = '', @KeyColumns NVARCHAR(2000) = '' , @Condition NVARCHAR(1000) = '')
AS
BEGIN
SET NOCOUNT ON

/* PROCEDURE CREATED 2010 FOR SQL SERVER 2000. SIMON HUGHES. */
/* NOTES: REMOVE --'s BELOW TO LIST GENERATED SQL. */

IF @SourceTable = '' OR @SourceTable = '?' OR @SourceTable = '/?' OR @SplitColumn = '' OR @KeyColumns = ''
BEGIN
PRINT 'Format for use:'
PRINT ' USP_LIST_CONCAT ''SourceTable'', ''SplitColumn'', ''Deli'', ''KeyColumn1,...'', ''Column1 = 12345 AND ...'''
PRINT ''
PRINT 'Description:'
PRINT 'The SourceTable should contain a number of records acting as a list of values.'
PRINT 'The SplitColumn should be the name of the column holding the values wanted.'
PRINT 'The Delimiter may be any single character or string ie ''/'''
PRINT 'The KeyColumn may contain a comma separated list of columns that will be returned before the concatenated list.'
PRINT 'The optional Conditions may be left blank or may include the following as examples:'
PRINT ' ''Column1 = 12334 AND (Column2 = ''ABC'' OR Column3 = ''DEF'')'''
PRINT ''
PRINT 'A standard list in the format:'
PRINT ' Store1, Employee1, Rabbits'
PRINT ' Store1, Employee1, Dogs'
PRINT ' Store1, Employee1, Cats'
PRINT ' Store1, Employee2, Dogs'
PRINT ''
PRINT 'Will be returned as:'
PRINT ' Store1, Employee1, Cats/Dogs/Rabbits'
PRINT ' Store1, Employee2, Dogs'
PRINT ''
PRINT 'A full ORDER BY and DISTINCT is included'
RETURN -1
END


DECLARE @SQLStatement NVARCHAR(4000)

SELECT @SQLStatement = '
DECLARE @DynamicSQLStatement NVARCHAR(4000)

SELECT @DynamicSQLStatement = ''SELECT '+@KeyColumns+', SUBSTRING(''

SELECT @DynamicSQLStatement = @DynamicSQLStatement + '' + '' + CHAR(10) +
'' MAX(CASE WHEN '+@SplitColumn+' = ''''''+RTRIM('+@SplitColumn+')+'''''' THEN '''''+@Deli+'''+RTRIM('+@SplitColumn+')+'''''' ELSE '''''''' END)''
FROM '+ @SourceTable +' ORDER BY '+@SplitColumn+'

SELECT @DynamicSQLStatement = @DynamicSQLStatement + '' ,2,7999) List'' + CHAR(10) + ''FROM '+ @SourceTable+''' + CHAR(10) +'''+CASE WHEN @Condition = '' THEN '/* WHERE */' ELSE 'WHERE '+@Condition END+ '''+ CHAR(10) + ''GROUP BY '+@KeyColumns+'''

SELECT @DynamicSQLStatement = REPLACE(@DynamicSQLStatement,''( +'',''('')

-- SELECT @DynamicSQLStatement -- DEBUG ONLY
EXEC (@DynamicSQLStatement)'

EXEC (@SQLStatement)

END
GO

EXEC USP_LIST_CONCAT 'MyTableName', 'ColumnForListing', 'Delimiter', 'KeyCol1, KeyCol2', 'Column1 = 123456'
1
ответ дан 5 December 2019 в 22:21
поделиться

У меня есть данные в следующем формате

Survey_question_ID

Электронная почта (Пользователь )

Ответ

для 1 опроса есть 13 вопросов и ответов желаемый результат, который я хотел, был

Пользователь --- Survey_question_ID1 --- Survey_question_ID2

электронная почта --- ответы --- ответ ........ так далее

Вот решение для SQL Server 2000 , тип данных поля причины - ТЕКСТ .

DROP TABLE #tmp

DECLARE @tmpTable  TABLE
(
emailno NUMERIC,
question1 VARCHAR(80),
question2 VARCHAR(80),
question3 VARCHAR(80),
question4 VARCHAR(80),
question5 VARCHAR(80),
question6 VARCHAR(80),
question7 VARCHAR(80),
question8 VARCHAR(80),
question9 VARCHAR(80),
question10 VARCHAR(80),
question11 VARCHAR(80),
question12 VARCHAR(80),
question13 VARCHAR(8000)
)

DECLARE @tmpTable2  TABLE
(
emailNumber NUMERIC
)

DECLARE @counter INT
DECLARE @Email INT

SELECT @counter =COUNT(DISTINCT ans.email) FROM answers ans WHERE ans.surveyname=100430 AND ans.qnpkey BETWEEN 233702 AND 233714
SELECT * INTO #tmp FROM @tmpTable
INSERT INTO @tmpTable2 (emailNumber) SELECT DISTINCT CAST(ans.email AS NUMERIC) FROM answers ans WHERE ans.surveyname=100430 AND ans.qnpkey BETWEEN 233702 AND 233714

WHILE @counter >0

BEGIN

        SELECT TOP 1 @Email= emailNumber FROM @tmpTable2
        INSERT INTO @tmpTable (emailno) VALUES (@Email )


        Update @tmpTable set question1=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233702 and ans.email=@Email
        Update @tmpTable set question2=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233703 and email=@email
        Update @tmpTable set question3=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233704 and email=@email
        Update @tmpTable set question4=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233705 and email=@email
        Update @tmpTable set question5=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233706 and email=@email
        Update @tmpTable set question6=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233707 and email=@email
        Update @tmpTable set question7=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233708 and email=@email
        Update @tmpTable set question8=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233709 and email=@email
        Update @tmpTable set question9=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233710 and email=@email
        Update @tmpTable set question10=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233711 and email=@email
        Update @tmpTable set question11=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233712 and email=@email
        Update @tmpTable set question12=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233713 and email=@email
        Update @tmpTable set question13=CAST(answer as VARCHAR(8000)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233714 and email=@email

        insert into #tmp select * from  @tmpTable       

        DELETE FROM @tmpTable       
        DELETE FROM @tmpTable2 WHERE emailNumber= @Email

        set @counter =@counter -1

End

select * from #tmp
0
ответ дан 5 December 2019 в 22:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: