2016-05-03 75 views
0

我正在嘗試編寫將每月抽出一個列表的代碼。該列表爲每個客戶提取多個記錄,我需要結果集爲每個客戶返回一行並提供各種彙總信息。爲每個客戶創建一個包含多行記錄的月度列表

因此,當我運行下面的代碼時,我得到了Max日期的正確答案,該日期給了我該客戶的最後一張發票,並且我得到正確的答案,總計所有發票仍然打開的金額總和。會有其他字段顯示賬戶的賬齡。但是,我爲每個客戶收取了很多行,因爲我有發票,每行顯示兩個彙總字段的「正確」答案。

我從查找Distinct開始,可以看到大多數答案都帶有窗口函數。我之前沒有使用過它們,我對使它們工作感到困惑。輸出需要按照特定的順序進行,這就是爲什麼我按照自己的方式列出的東西。在這一點上,我已經閱讀了很多幫助論壇,我覺得喝醉了,所以我想我錯過了一個明顯的答案。

SELECT cl.[document type] AS [RecordType], 
     c.[no_], 
     c.[name], 
     c.[name 2], 
     c.[address], 
     c.[address 2], 
     c.city, 
     c.[post code] AS [Zip], 
     c.[county] AS [State], 
     c.[country_region code] AS CountyTrim, 
     Month(Getdate()) AS [FigMonth], 
     Day(Getdate()) AS [FigDay], 
     Year(Getdate()) AS [FigYear], 
     --Next 2 lines should pull last invoice for customer to fill LastSaleDate field 
     (
     SELECT Max(cl2.[posting date]) 
     FROM [dbo].[detailed cust_ ledg_ entry] AS cl2 
     WHERE cl2.[document type] = 2 AND cl2.[customer no_] = c.[no_] 
     ) AS [LastSaleDate], 
     c.[payment terms code] AS [Terms 1], 
     --iif instead of case to fill Terms1Open field 
     Iif (c.[payment terms code] = 'CreditCard/Pre-Auth', 'N', 'Y') AS [Terms1Open], 
     --Now totaling invoices per customer 
     (
     SELECT Sum(cl3.[amount]) 
     FROM [dbo].[detailed cust_ ledg_ entry] AS cl3 
     WHERE cl3.[customer no_] = c.[no_] 
     GROUP BY cl3.[customer no_] 
     ) AS [DollarsTotal] 
FROM [dbo].[customer] AS c 
JOIN [dbo].[detailed cust_ ledg_ entry] AS cl 
    ON c.[no_] = cl.[customer no_] 
JOIN [dbo].[cust_ ledger entry] AS l 
    ON l.[document no_] = cl.[document no_] 
WHERE l.[open] = 1 
     AND cl.[document type] = 2 
     AND c.[customer posting group] IN ('BIKECUST', 'OUTDRCUST') 
ORDER BY c.[no_] 
+1

格式化使我想要拿出我的眼球並用噴砂機拍攝它們。有時別名在同一行上,有些時候不是。花10分鐘來清理你的sql將是第一步。第2步從網上論壇獲得幫助。對於這個過程你應該從這裏開始。 http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

+0

哎唷!聽聽你說過的話。將盡力做得更好。在這裏找到了很多答案,所以這是我轉身的第一個地方之一。 – cjs

回答

0

我不能完全確定它是什麼你想要做的,但根據您的SQL,我已經重寫它做什麼,我認爲是邏輯的代碼最好的描述。

如果我可以提供一個建議,如果這是您自己的模式 - 我會認真考慮重命名的一切以符合最佳實踐。

SELECT CL.[document type] AS [RecordType] 
     ,C.[no_] 
     ,C.[name] 
     ,C.[name 2] 
     ,C.[address] 
     ,C.[address 2] 
     ,C.city 
     ,C.[post code] AS [Zip] 
     ,C.[county] AS [State] 
     ,C.[country_region code] AS CountyTrim 
     ,Month(Getdate()) AS [FigMonth] 
     ,Day(Getdate()) AS [FigDay] 
     ,Year(Getdate()) AS [FigYear] 
     ,MAX(CL.[posting date]) AS [LastSaleDate] 
     ,C.[payment terms code] AS [Terms 1] 
     ,CASE WHEN C.[payment terms code] = 'CreditCard/Pre-Auth' 
       THEN 'N' 
       ELSE 'Y' END AS [Terms1Open] 
     ,SUM(CL.[amount]) AS [DollarsTotal] 
    FROM dbo.Customer C 
    JOIN dbo.[detailed cust_ ledg_ entry] CL 
    ON C.[no_] = CL.[customer no_] 
    JOIN dbo.[cust_ ledger entry] L 
    ON L.[document no_] = CL.[document no_] 
WHERE L.[open] = 1 
    AND CL.[document type] = 2 
    AND C.[customer posting group] IN ('BIKECUST', 'OUTDRCUST') 
GROUP 
    BY CL.[document type] 
     ,C.[no_] 
     ,C.[name] 
     ,C.[name 2] 
     ,C.[address] 
     ,C.[address 2] 
     ,C.city 
     ,C.[post code] 
     ,C.[county] 
     ,C.[country_region code] 
     ,Month(Getdate())            
     ,Day(Getdate())             
     ,Year(Getdate())  
     ,CASE WHEN C.[payment terms code] = 'CreditCard/Pre-Auth' 
       THEN 'N' 
       ELSE 'Y' END 
    ORDER 
    BY C.[no_] 
+0

謝謝。不是我的模式和我的問題顯然是關於我的工作,而不是我必須使用的模式。這個答案可以讓我和其他人一起前進。當我的要求措辭時,我會盡力做得更好。 – cjs

+0

我很高興我能夠很好地閱讀邏輯,讓你的球滾動! – EastOfJupiter

相關問題