運行SQL Server的2005/2008,我重寫我的查詢是更清潔,更符合不包括壞習慣。我曾經有很多IF
陳述和PIVOT
這樣做,但找到了一個更好的方式來實現它,只需要最後一點,使其幾乎完美。INSERT INTO動態添加列
DECLARE @startdate DATETIME;
DECLARE @enddate DATETIME;
DECLARE @showstore INT;
DECLARE @showcashier INT;
DECLARE @showregister INT;
DECLARE @showdate INT;
DECLARE @sql NVARCHAR(MAX);
DECLARE @result0 NVARCHAR(MAX);
SET @startdate = '1/1/2012';
SET @enddate = '2/28/2013';
SET @showdate = 1;
SET @showstore = 0;
SET @showcashier = 1;
SET @showregister = 0;
SET @startdate = DATEADD(DAY, DATEDIFF(DAY, 0, @startdate), 0);
SET @enddate = DATEADD(DAY, DATEDIFF(DAY, 0, @enddate), 0);
SET @sql = N'CREATE TABLE ##a13 (' + SUBSTRING(
CASE WHEN @showdate = 1 THEN ',[Transaction Date] DATETIME' ELSE '' END +
CASE WHEN @showstore = 1 THEN ',[Store ID] VARCHAR(10)' ELSE '' END +
CASE WHEN @showcashier = 1 THEN ',[Cashier] VARCHAR(100)' ELSE '' END +
CASE WHEN @showregister = 1 THEN ',[Register] VARCHAR(20)' ELSE '' END, 2, 2000);
DECLARE myCursor CURSOR FOR
SELECT DISTINCT c.CurrencyDesc
FROM dbo.Currencies AS c INNER JOIN dbo.rpPay AS p ON c.POSCurrency = p.PayType
INNER JOIN dbo.RPTrs AS r ON r.ReceiptNO = p.ReceiptNo
WHERE
c.CurrencyDesc <> 'Testing' AND c.CurrencyDesc <> 'Cash Change' AND
r.TRSDate >= @startdate AND r.TRSDate <= @enddate
OPEN myCursor
FETCH NEXT FROM myCursor INTO @result0
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = @sql + ',[' + @result0 + '] INT'
FETCH NEXT FROM myCursor INTO @result0
END
CLOSE myCursor
DEALLOCATE myCursor
SET @sql = @sql + ')'
EXECUTE sp_executesql @sql, N'@startdate DATETIME,
@enddate DATETIME',@startdate, @enddate;
SET @sql = 'SELECT * FROM ##a13; DROP TABLE ##a13'
EXECUTE sp_executesql @sql
返回一個空行的表。 (知道貨幣表有更多CurrencyDesc然後在這裏顯示,因爲這些都只是在提供的日期範圍內所使用的那些)
這正是我從它的期望。迄今爲止非常棒。現在我需要根據日期範圍(@startdate >= and <= @enddate
)向其添加數據行,並取決於他們從4種可能的選項中檢查了什麼(@showstore, @showcashier, @showdate, @showregister
)
示例:日期從2013年1月1日到2 /只有(如被看見在圖片)二千零十三分之二十八並顯示註冊應該有這樣的數據:
| Register | Cash | House Acct | MasterCard | Visa/MC
--------------------------------------------------------
1 | 01 | 20.00 | 235.25 | 1235.32 | 135.23
2 | 02 | 30.00 | 3542.42 | 323.52 | 523.64
3 | 03 | 23.35 | 100.32 | 3267.24 | 235.25
原因2005/2008是因爲一些,這是對執行的客戶,仍然使用2005年才能使用PIVOT
我將不得不更改爲2005年
PS每個數據庫的兼容級別。在我得到的又喊道,如果我用#A13,而不是全球## A13的它給了我
Msg 208, Level 16, State 0, Line 1
Invalid object name '#a13'.
我可以做的,所以我不使用全局臨時表?
「原因2005/2008是因爲一些,這是對執行的客戶,仍然使用2005年爲了使用PIVOT我將不得不更改爲2005年每個數據庫的兼容級別」咦? – swasheck 2013-02-28 19:42:38
那麼你問如何不使用'## GLOBAL'臨時表? – JNK 2013-02-28 19:42:45
我對你有關'pivot'的評論感到困惑,兩個sql server 2005/2008都有這個功能。 – Taryn 2013-02-28 19:43:42