Member 10202727 Ответов: 1

Сводные столбцы в ms SQL


Мне нужно использовать pivot для создания таблицы времени из следующих данных:
а записи содержат внутреннее соединение.Я пробовал и предоставлял код, но не смог его получить
Я надеюсь, что это достаточные данные

starttime endtime subjname dd
9            11    History Monday
11           13    Physics Tuesday


Я использую этот запрос, чтобы создать столбцы
select 
    start_time, end_time, s.subj_name, tt.dd
from 
    time_table tt 
inner join 
    subj s on tt.subjid = s.subjid 


Я могу повернуть свой результат, используя приведенный ниже код

--Declare necessary variables
DECLARE   @SQLQuery AS NVARCHAR(MAX)
DECLARE   @PivotColumns AS NVARCHAR(MAX)

--Get unique values of pivot column  
SELECT @PivotColumns = COALESCE(@PivotColumns + ',','') + QUOTENAME(dd)
FROM (SELECT DISTINCT(dd)
      FROM time_table tt
      WHERE divid = 1 AND tt.active = 1) AS PivotExample

SELECT @PivotColumns

--Create the dynamic query with all the values for 
--pivot column at runtime
SET   @SQLQuery = 
    N'SELECT start_time,end_time, ' +   @PivotColumns + ' 
    FROM [dbo].[time_table]  
    PIVOT( SUM(subjid) 
          FOR dd IN (' + @PivotColumns + ')) AS P' 

SELECT   @SQLQuery

--Execute dynamic query
EXEC sp_executesql @SQLQuery


И получение вывода в виде
Starttime endtime Monday Tuesday Wednesday
9          11     7        8       null
11         13     null     7         9



Здесь я получаю subjectid и, но я хочу, чтобы имя субъекта было другим,как показано в приведенном выше запросе, помогите мне с этой проблемой.Я попытался дать функцию max() agreegate, так как это varchar, но я думаю, что получаю ошибку из-за соединения
Спасибо.

RedDk

Слово "PIVOT" - это действительно неприятное слово пользователя базы данных для более приятного слова, используемого математиками (линейная алгебра) и тому подобное,"транспонировать". Посмотрите на транспонирование usg Google с помощью "MS SQL "и"How to". Место для начала ... экспериментирующий.

1 Ответов

Рейтинг:
11

CHill60

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

SELECT * FROM 
(
    -- source query
) src
PIVOT
(
    -- pivot definition
)
вместо формата, который вы используете, вы можете легко добавить соединение
--Create the dynamic query with all the values for 
--pivot column at runtime
SET   @SQLQuery = 
    N'SELECT * FROM
	(SELECT start_time,end_time,subj_name,dd
    FROM [dbo].[time_table] tt 
	INNER JOIN subj s on tt.subjid = s.subjid 
	) SRC
    PIVOT( MAX(subj_name) 
          FOR dd IN (' + @PivotColumns + ')) AS P' 
Обратите внимание, что я использую MAX() скорее, чем SUM() чтобы получить название курса


Member 10202727

Спасибо, приятель ....
Ты скала......