2013-11-01 1 views
1

У меня есть таблицы в SQL Server 2008, таких как:TSQL Выберите запрос, который генерирует результат, похожий на MS Access несколько полей значений

TopicTable

TopicID: nvarchar (Primary Key) 
ProgID: nvarchar 
topic1: bit 
topic2: bit 
topic3: bit 
topic4: bit 

тема таблица выглядит примерно следующее:

TopicID  ProgID  topic1  topic2  topic3  topic4 

topic001  prog001   1    1    0    0 
topic002  prog002   1    0    1    1 
topic003  prog003   1    0    0    0 
topic004  prog004   1    1    1    1 

Программа стол:

ProgID: nvarchar (Primary Key) 
ProgramName: nvarchar 

В таблице программы выглядит следующим образом:

ProgID   ProgramName   

prog001  programA    
prog002  programB 
prog003  programC 
prog004  programD 

Я хочу, чтобы создать представление, чтобы получить выходной сигнал как:

ProgID   ProgramName   Topic 

    prog001  programA    topic1,topic2 
    prog002  programB    topic1,topic3,topic4 
    prog003  programB    topic1 
    prog004  programD    topic1,topic2,topic3,topic4 

Пожалуйста, может кто-то помочь мне, как получить это. Спасибо.

+0

Показать данные и ожидаемый результат. – Kaf

+0

Взгляните здесь: http://codecorner.galanter.net/2009/06/25/t-sql-string-aggregate-in-sql-server/ –

+0

@YuriyGalanter. Эта ссылка была хорошей, но ее не совсем то, что я ищу. Я хочу, чтобы имена столбцов были возвращены как значения столбцов, а затем их агрегировали для каждого ProgID – ksagar

ответ

0

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

CREATE Table Topic (Topic NVARCHAR(20), Programe NVARCHAR(20), Topic1 bit, Topic2 bit,Topic3 bit,Topic4 bit) 
GO 
INSERT INTO Topic 
VALUES 
('topic001','prog001',1,1,0,0), 
('topic002','prog002',1,0,1,1), 
('topic003','prog003',1,0,0,0), 
('topic004','prog004',1,1,1,1) 
GO 


CREATE TABLE Programe (P_ID NVARCHAR(20) , Name NVARCHAR(20)) 
GO 
INSERT INTO Programe VALUES 
('prog001','programA'),    
('prog002','programB'), 
('prog003','programC'), 
('prog004','programD') 
GO 

Просмотр Определение

CREATE VIEW vw_ViewName 
AS 
SELECT P_ID, Name, ISNULL(STUFF(L1.Topic1L, 1, 1 , '') + ', ', '') + ISNULL(STUFF(L2.Topic2L, 1, 1, '') + ', ', '') 
            + ISNULL(STUFF(L3.Topic3L, 1, 1, '')+ ', ', '') + ISNULL(STUFF(L4.Topic4L, 1, 1, '')+ ', ', '') AS Topics 
FROM Programe P CROSS APPLY (
          SELECT ' ' + CASE WHEN Topic1 = 1 THEN 'Topic1' ELSE NULL END [text()] 
          FROM Topic 
          WHERE Programe = P.P_ID 
          FOR XML PATH('') 
          )L1(Topic1L) 
       CROSS APPLY (
          SELECT ', ' + CASE WHEN Topic2 = 1 THEN 'Topic2' ELSE NULL END [text()] 
          FROM Topic 
          WHERE Programe = P.P_ID 
          FOR XML PATH('') 
          )L2(Topic2L) 
       CROSS APPLY (
          SELECT ', ' + CASE WHEN Topic3 = 1 THEN 'Topic3' ELSE NULL END [text()] 
          FROM Topic 
          WHERE Programe = P.P_ID 
          FOR XML PATH('') 
          )L3(Topic3L) 
       CROSS APPLY (
          SELECT ', ' + CASE WHEN Topic4= 1 THEN 'Topic4' ELSE NULL END [text()] 
          FROM Topic 
          WHERE Programe = P.P_ID 
          FOR XML PATH('') 
          )L4(Topic4L) 

РЕЗУЛЬТАТ SET

P_ID Name  Topics 
prog001 programA Topic1, Topic2, 
prog002 programB Topic1, Topic3, Topic4, 
prog003 programC Topic1, 
prog004 programD Topic1, Topic2, Topic3, Topic4, 
+0

. Представление работает точно так, как я хотел, но я получаю это сообщение об ошибке синтаксиса каждый раз, когда я открываю дизайн представления. В сообщении об ошибке говорится: Ошибка в предложении WHERE рядом с '('. Невозможно проанализировать текст запроса. Он исчезает, когда я нажимаю кнопку «ОК», и она выполняется без каких-либо проблем. Я не могу понять, почему это сообщение об ошибке появляется. (Topic1L), (Topic2L), (Topic3L), (Topic4L). – ksagar

+0

Я создал таблицы, а затем выполнил оператор представления, и он отлично работает. Проверьте свой синтаксис, возможно, когда вы заменяете имена таблиц в этом запросе на самом деле имена таблиц у вас чего-то нет. –

+0

Если вы создаете таблицы, которые я создал в своем ответе, а затем wxecute, запрос не вызывает ошибки. Это означает, что синтаксис правильный. Просто внимательно прочитайте код и попытайтесь следовать логике, я уверен, что он будет работать :) –

1

Это будет выглядеть следующим образом:

;WITH cteTopics AS (
SELECT T.ProgID 
    ,STUFF((
    SELECT T1.TopicID + ',' 
    FROM TopicTable T1 
    WHERE T1.ProgID = T.ProgID 
    FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR (MAX)') 
    ,1,0,'') [Topics] 
FROM TopicTable T 
GROUP BY T.ProgID) 

SELECT P.ProgID, P.ProgramName, T.Topics 
FROM Program P 
LEFT JOIN cteTopics T ON T.ProgID = P.ProgID 

http://sqlfiddle.com/#!3/b9e4a/4

Смежные вопросы