0
我有下面的代碼,其評價不同的時間段,並採取它們之間的差值,對於每個組,T-SQL在創建基於列和迭代UID它
例如
TimePeriod Value1
201607 50
201608 80
的代碼減去80-50 = 30(週期)。
我也有一個基於我的表中的幾列創建的UID。我必須使用這個自定義UID,並且不能在表格或任何特定列上使用PK。
WITH cte
AS (SELECT
ISNULL(CAST(TransactionID AS nvarchar), '_nullTransactionId_') + ISNULL(Description, '_nullDescription_') + CAST(Account AS nvarchar) + Category + Currency + Entity + Scenario AS UID,
LEFT(TimePeriod, 6) Period,
SUM(Value1) Value1,
CAST(LEFT(TimePeriod, 6) + '01' AS date) ord_date
FROM MyTestTable
GROUP BY LEFT(TimePeriod, 6),
TransactionID,
Description,
Account,
Category,
Currency,
Entity,
Scenario,
TimePeriod)
SELECT
a.UID,
a.Period,
--a.Value1,
ISNULL(a.Value1, 0) - ISNULL(b.Value1, 0) Periodic
FROM cte a
LEFT JOIN cte b
ON a.ord_date = DATEADD(MONTH, 1, b.ord_date)
ORDER BY a.UID
問題是,該代碼生成的結果比我的表中的行多得多。當我仔細觀察它時,我可以看到任何給定UID的第一個(週期性)結果是正確的,但隨後的結果是錯誤的。
我不知道從哪裏開始走向解決方案,我在考慮GROUP BY可能導致這種情況,但是我'有'列出組中的字段,否則我無法制作UID。
非常感謝任何指導。
對於我們能夠幫助我們很多需要更多的細節。這裏是開始改善你的問題的好地方。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/我也注意到你正在轉換爲nvarchar,但你沒有指定長度。你應該總是指定長度。您是否知道默認長度根據使用方式而改變?我也有一種感覺,你的ord_date是一個varchar列而不是日期時間。你真的應該將日期時間信息存儲在日期時間數據類型中。 –
@SeanLange - 感謝您提供的URL。有時問是困難的部分,我會用它。 –