我有存在返回空值3個表(tblPreference
,tblCustomer
,tblCustomerPreference
),看起來像下面這樣:SQL Server的動態支點當沒有數據
tblPreference:
ID | Name | DefaultValue
(int PK) | (nvarchar(100)) | (nvarchar(100))
-------------------------------
1 | Preference1 | 1
2 | Preference2 | Yes
3 | Preference3 | 1
tblCustomer:
CustomerID | ...
(int PK)
--------------------
1 | ...
2 | ...
3 | ...
tblCustomerPreference:
ID | CustomerID | PreferenceID | Value
(int PK) | (int) | (int) | (nvarchar(100))
-------------------------------------------------------
1 | 1 | 1 | 0
2 | 1 | 2 | Yes
3 | 2 | 1 | 0
4 | 2 | 2 | No
我創建這個數據的一個支點所以這一切都在使用下面的存儲過程,它會一直拉回來所有的喜好單行,如果找到一個客戶特定值時,返回否則返回默認值:
CREATE PROCEDURE [dbo].[usp_GetCustomerPreferences] @CustomerID int AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @PivotColumns nvarchar(max)
DECLARE @PivotColumnsSelectable nvarchar(max)
SELECT @PivotColumns = COALESCE(@PivotColumns + ',','') + QUOTENAME(Preference.Name),
@PivotColumnsSelectable = COALESCE(@PivotColumnsSelectable + ',' + Char(10),'') + Preference.Source + '.' + QUOTENAME(Preference.Name) + ' AS ' + QUOTENAME(Preference.Name)
FROM (SELECT [Name],
'PreferencePivot' AS [Source]
FROM [dbo].[tblPreference]) Preference
DECLARE @sqlText nvarchar(max)
SELECT @sqlText = 'SELECT ' + @PivotColumnsSelectable + '
FROM (SELECT tblPreference.Name AS PreferenceName,
CASE
WHEN tblCustomerPreference.Value IS NOT NULL THEN tblCustomerPreference.Value
ELSE tblPreference.DefaultValue
END AS Value,
@innerCustomerID AS CustomerID
FROM tblCustomerPreference
RIGHT JOIN tblPreference ON tblCustomerPreference.PreferenceID = tblPreference.ID
WHERE (tblCustomerPreference.CustomerID = @innerCustomerID OR tblCustomerPreference.ID IS NULL)) data
PIVOT (MAX(Value)
FOR PreferenceName IN (' + @PivotColumns + ')) PreferencePivot'
EXECUTE sp_executesql @sqlText, N'@innerCustomerID int', @CustomerID
END
的問題,我跑吧進入是當我查詢CustomerID 1或2時,所有事情都按預期方式返回,所有值都按預期填充。但是,如果我查詢CustomerID 3,它將返回一個NULL
爲其他客戶填充的任何偏好ID。如果我在沒有PIVOT
表達式的情況下運行查詢,它將返回按預期填充的所有首選項。只有當我穿透數據時,NULL
纔會進入。我希望我錯過了一些簡單的事情,但我沒有看到錯誤。
太棒了!像我預料的那樣工作。考慮到它在pivoting之前創建臨時表,我認爲WHERE語句將在聚合中考慮。我將來必須記住這一點。 – 2009-11-13 14:25:08