2016-03-30 9 views
-1

У меня есть мастер-таблица, которая не содержит эти столбцы (Visit_date, М-1, М-2, М-3), но в конечном итоге мне нужно эти столбцы (Visit_date, М-1, М-2, М-3) наряду с существующими столбцами мастер-таблицы, такие какДинамически построить статические столбцы, используя стержень в SQL Server

Retailer_id, survey_id, Group_Id, survery_Name 

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

Master стол:

RetailerID Retailer SurveyName Date  Score Weights 
    198760  ABC  Quality 06/03/2016 10  10 
    198760  ABC  Quality 06/02/2016 5  10 
    198760  ABC  Quality 06/01/2016 5  5 
    198760  ABC  Quality 06/12/2015 10  10 

Ожидаемый результат:

Retailer_id survery_Name Last_Visit M-1 M-2 M-3 Weightage 
    198760  quality   10   5  5  10  10 

Сценарий:

CREATE TABLE [dbo].[Master_Table] 
(
    [Retailer_ID] [nvarchar](50) NULL, 
    [RQSC_Survey_Name] [nvarchar](50) NULL, 
    [RQSC_Date] [date] NULL, 
    [RQSC_Weightage] [decimal](18, 0) NULL, 
    [RQSC_Score] [decimal](18, 0) NULL 
) ON [PRIMARY] 

INSERT [dbo].[Master_Table] ([Retailer_ID], [RQSC_Survey_Name], [RQSC_Date], [RQSC_Weightage], [RQSC_Score]) 
VALUES (N'198760', N'Quality', CAST(0x1C3B0B00 AS Date), CAST(10 AS Decimal(18, 0)), CAST(10 AS Decimal(18, 0))) 

INSERT [dbo].[Master_Table] ([Retailer_ID], [RQSC_Survey_Name], [RQSC_Date], [RQSC_Weightage], [RQSC_Score]) 
VALUES (N'198760', N'Quality', CAST(0x003B0B00 AS Date), CAST(10 AS Decimal(18, 0)), CAST(5 AS Decimal(18, 0))) 

INSERT [dbo].[Master_Table] ([Retailer_ID], [RQSC_Survey_Name], [RQSC_Date], [RQSC_Weightage], [RQSC_Score]) 
VALUES (N'198760', N'Quality', CAST(0xE13A0B00 AS Date), CAST(5 AS Decimal(18, 0)), CAST(5 AS Decimal(18, 0))) 

INSERT [dbo].[Master_Table] ([Retailer_ID], [RQSC_Survey_Name], [RQSC_Date], [RQSC_Weightage], [RQSC_Score]) 
VALUES (N'198760', N'Quality', CAST(0xC23A0B00 AS Date), CAST(10 AS Decimal(18, 0)), CAST(10 AS Decimal(18, 0))) 

Мой запрос:

SELECT 
    Retailer_ID, RQSC_Survey_Name, 
    [1] As LastVist, [2] as 'M-1', [3] as 'M-2', [4] as 'M-3', 
    [1] as 'Score' 
FROM 
    (SELECT 
     RQSC_Score, Retailer_ID, RQSC_Survey_Name, 
     RQSC_Weightage, 
     ROW_NUMBER() OVER (PARTITION BY Retailer_ID ORDER BY RQSC_Date DESC) AS Rownumber 
    FROM 
     master_table 
    WHERE 
     Retailer_ID = 198760 AND RQSC_Survey_Id = 298) src 
PIVOT(SUM(RQSC_Score)for Rownumber in ([1], [2], [3],[4])) piv; 

Вот если я выбираю weightage колонку я получаю повторяющиеся строки основаны на колонке weightage но ожидаемого результата I должен получить весовую колонку

+0

почему розничный идентификатор обратился к 123 рому ABC – mohan111

ответ

0

Я получил решение

WITH CTE as 
(

select retailer ,surveyname ,max([date]) 
over(partition by retailer,surveyname)as [date],score ,weights, 
row_number() over(partition by retailer,surveyname order by [date] desc 
) 

as rn from #temp) 

select p.retailer,p.surveyname,p.[1] as lastvisit,p.[2] as [m-1], 
p.[3] as [m-2],p.[4] as [m-3],b.score,b.weights ,b.[date] from 
(

select retailer,surveyname,score,rn from cte) as a pivot (sum(score) 
for rn in ([1],[2],[3],[4]) 
) as p   
inner join cte as b on b.retailer=p.retailer and b.surveyname=p.surveyname and b.rn=1 ; 
0

Извините за задержку Я занят работой. На основе ваших данных образца мы можем достичь, используя материал и Dynamic Sql

IF object_id('tempdb..#Temp') is not null 
    DROP TABLE #TEMP 


CREATE TABLE #Temp 
    (Retailer varchar(10), SurveyName varchar(10), Date datetime, Score int, Weights int) 
; 

INSERT INTO #Temp 
    (Retailer, SurveyName, Date, Score, Weights) 
VALUES 
    ('198760', 'Quality', '2016-06-03 05:30:00', 10, 10), 
    ('198760', 'Quality', '2016-06-02 05:30:00', 5, 10), 
    ('198760', 'Quality', '2016-06-01 05:30:00', 5, 5), 
    ('198760', 'Quality', '2015-06-12 05:30:00', 10, 10) 
; 



DECLARE @statement NVARCHAR(max) 
,@columns NVARCHAR(max), 
@col NVARCHAR(max) 


SELECT @columns = 
    STUFF((SELECT distinct '],[' + 
         CAST(ROW_NUMBER() OVER (PARTITION BY Retailer ORDER BY Date DESC) AS VARCHAR(50)) AS Rownumber 
         FROM #Temp 
         FOR XML PATH(''), TYPE 
        ).value('.', 'NVARCHAR(MAX)') 
         , 1, 2, '')+ ']' 

SELECT @statement = 'SELECT 
    Retailer, SurveyName, 
    MAX([1]) As LastVist, MAX([2]) as ''M-1'', MAX([3]) as ''M-2'', MAX([4]) as ''M-3'', 
    MAX([1]) as ''Score'' 
FROM 
    (
    SELECT 
     Retailer, SurveyName, Score, 
     Weights, 
     ROW_NUMBER() OVER (PARTITION BY Retailer ORDER BY Date DESC) AS Rownumber 
    FROM 
     #Temp 

     ) src 
PIVOT(SUM(Score)for Rownumber in (' + @columns + ')) as pvt 
GROUP BY Retailer, SurveyName' 

EXEC sp_executesql @statement = @statement 
+0

, что это именно @Pradeep почему вы отправили это я уже дал вам решение – mohan111

+0

Ничего себе это замечательно @ mohan111, но в конечном итоге мне нужен столбец весов, поэтому я выбрал столбец весов в нижеприведенном запросе, так вот возникает проблема 1. Когда я выбираю столбцы весов, я получаю две строки, но только одна строка должна прийти 2. Значение столбца веса должно быть 10, а не 5, почему becau se в соответствии с текущим значением веса месяца составляет 10 – Pradeep

+0

SELECT Retailer, SurveyName, MAX ([1]) Как LastVist, MAX ([2]) как «M-1», MAX ([3]) как ' М-2 '', MAX ([4]), как '' М-3 '', MAX ([1]), как '' Score '', весов, Дата ОТ ( ВЫБОР розничного торговца, SurveyName, Score , Массы, дата, ROW_NUMBER() OVER (PARTITION BY Retailer ORDER BY DESC Дата) КАК RowNumber ОТ #Temp ) SRC ОСИ (SUM (Оценка) для RowNumber в ('+ @columns +')) as pvt GROUP BY Retailer, SurveyName, Weights, Date – Pradeep

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