2016-09-14 18 views
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。

非常感謝任何指導。

+1

對於我們能夠幫助我們很多需要更多的細節。這裏是開始改善你的問題的好地方。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/我也注意到你正在轉換爲nvarchar,但你沒有指定長度。你應該總是指定長度。您是否知道默認長度根據使用方式而改變?我也有一種感覺,你的ord_date是一個varchar列而不是日期時間。你真的應該將日期時間信息存儲在日期時間數據類型中。 –

+0

@SeanLange - 感謝您提供的URL。有時問是困難的部分,我會用它。 –

回答

1

您可能想要對每個UID進行評估嗎?在這種情況下,您在連接子句中缺少UID。

查詢應該是:

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.UID = b.UID and a.ord_date = DATEADD(MONTH, 1, b.ord_date) 
ORDER BY a.UID 
+0

真棒觀察員!謝謝 –