2012-10-19 1 views
1

это моя первая попытка динамического поворота в SQL, и я стал немного застрял!Динамический SQL Pivot - удаление нулей

У меня есть две таблицы, к которым я присоединяюсь, один держит биржевые позиции, а другой имеет разные цены на акции для разных сайтов (источников). Поскольку существует вероятность наличия разных сайтов, запрос должен быть динамическим.

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

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

ID site-site1 site-site2 site-site3 
1  null   1.99   2.99 
2  12.99   null   10.00 
3  1.50   null   2.00 

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

DECLARE @sources nvarchar(max) 

SELECT @sources = 
STUFF((SELECT DISTINCT ',[' + 
CASE 
WHEN ip.[Source] is null or ip.[Source] = '' THEN 'Default' 
ELSE ip.[Source] 
END 
+ ' - ' + 
CASE 
WHEN ip.secondSource is null or ip.secondSource = '' THEN 'Default' 
ELSE ip.secondSource 
END 
+ ']' 
    FROM itemprice ip 
    for XML PATH('') 
), 1, 1, '') 

DECLARE @SQL nvarchar(MAX) 
SELECT @SQL = N' 
SELECT * 
FROM 
(
SELECT 
s.id, 
[Source] = CASE 
       WHEN ip.[Source] is null or ip.[Source] = '''' THEN ''Default'' 
     ELSE ip.[Source] 
     END + '' - '' + 
CASE WHEN ip.secondSource is null or ip.secondSource = '''' THEN ''Default'' 
ELSE ip.secondSource 
END, 
    SalePrice = isnull(ip.SalePrice, 0) 
    FROM stock s 
    LEFT OUTER JOIN itemprice ip on ip.id = s.id 
) data 
PIVOT 
( 
    MAX(SalePrice) for [Source] IN (' + @sources + ') 
) as PivotTable 
ORDER BY PivotTable.id' 
exec sp_executesql @sql 

Любая помощь будет высоко оценена, кажется, как будто это не так просто, как упаковка каждого @ источник в ISNULL.

Благодаря

+0

Что вы имеете в виду, удалив нули? Что вы хотите занять их место? – podiluska

+0

Извините, должно быть, было более понятно, в этом случае мне понадобилось 0s –

ответ

2

К сожалению, вы должны IsNull каждый из отдельных повернута колонн. Либо это, либо CROSS ПРИСОЕДИНЯЙТЕ ваш подзапрос data, чтобы сгенерировать полную матрицу и выполнить ISNULL там.

например. заменить NULL на 0, используя ISNULL на повернутых столбцах:

DECLARE @sources nvarchar(max), @Selectlist nvarchar(max) 

SELECT @sources = 
STUFF((SELECT DISTINCT ',[' + 
CASE 
WHEN ip.[Source] is null or ip.[Source] = '' THEN 'Default' 
ELSE ip.[Source] 
END 
+ ' - ' + 
CASE 
WHEN ip.secondSource is null or ip.secondSource = '' THEN 'Default' 
ELSE ip.secondSource 
END 
+ ']' 
    FROM itemprice ip 
    for XML PATH('') 
), 1, 1, '') 

SELECT @Selectlist = 
STUFF((SELECT DISTINCT ',ISNULL([' + 
CASE 
WHEN ip.[Source] is null or ip.[Source] = '' THEN 'Default' 
ELSE ip.[Source] 
END 
+ ' - ' + 
CASE 
WHEN ip.secondSource is null or ip.secondSource = '' THEN 'Default' 
ELSE ip.secondSource 
END 
+ '],0) [' + 
CASE 
WHEN ip.[Source] is null or ip.[Source] = '' THEN 'Default' 
ELSE ip.[Source] 
END 
+ ' - ' + 
CASE 
WHEN ip.secondSource is null or ip.secondSource = '' THEN 'Default' 
ELSE ip.secondSource 
END 
+ ']' 
    FROM itemprice ip 
    for XML PATH('') 
), 1, 1, '') 

DECLARE @SQL nvarchar(MAX) 
SELECT @SQL = N' 
SELECT ID, ' + @Selectlist + ' 
FROM 
(
SELECT 
s.id, 
[Source] = CASE 
       WHEN ip.[Source] is null or ip.[Source] = '''' THEN ''Default'' 
     ELSE ip.[Source] 
     END + '' - '' + 
CASE WHEN ip.secondSource is null or ip.secondSource = '''' THEN ''Default'' 
ELSE ip.secondSource 
END, 
    SalePrice = isnull(ip.SalePrice, 0) 
    FROM stock s 
    LEFT OUTER JOIN itemprice ip on ip.id = s.id 
) data 
PIVOT 
( 
    MAX(SalePrice) for [Source] IN (' + @sources + ') 
) as PivotTable 
ORDER BY PivotTable.id' 
exec sp_executesql @sql 
+0

+1, однако лучше использовать 'QUOTENAME (Column)', а не ''[' + column + ']'. Если один из динамически созданных столбцов содержит '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''' – GarethD

+0

Хотя я сказал, что, если какой-либо из динамически создаваемых столбцов содержит квадратные скобки, это приведет к тому, что замена не сработает ... Возможно, создание списков столбцов для точки поворота и выбор отдельно будет более надежным решением? – GarethD

+0

Список столбцов сводной таблицы ** IS ** список столбцов выбора базы. И если решение работает для OP, я не буду делать ставку на имена столбцов, не содержащие '[]'. Но да, я лично использую 'QUOTENAME'. – RichardTheKiwi