1

これはSQLでの動的ピボットの最初の試みであり、少し行き詰まりました。

参加しているテーブルが2つあり、1つは在庫アイテムを保持し、もう1つは異なるWebサイト(ソース)の在庫アイテムの異なる価格を保持しています。異なるサイトを持つ可能性があるため、クエリは動的である必要があります。

問題は、結果からnullを削除できないことであり、誰かが助けてくれることを望んでいました。

結果は現在次のようになります。

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で各@sourcesアイテムをラップするほど単純ではないように見えます。

ありがとう

4

1 に答える 1

2

残念ながら、個々のピボットされた列のそれぞれをISNULLにする必要があります。それまたはdataサブクエリをCROSSJOINして完全な行列を生成し、そこでISNULLを実行します。

たとえば、ピボット列でISNULLを使用してNULLを0に置き換えるには、次のようにします。

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
于 2012-10-19T10:29:03.387 に答える