我正在嘗試編寫將每月抽出一個列表的代碼。該列表爲每個客戶提取多個記錄,我需要結果集爲每個客戶返回一行並提供各種彙總信息。爲每個客戶創建一個包含多行記錄的月度列表
因此,當我運行下面的代碼時,我得到了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_]
格式化使我想要拿出我的眼球並用噴砂機拍攝它們。有時別名在同一行上,有些時候不是。花10分鐘來清理你的sql將是第一步。第2步從網上論壇獲得幫助。對於這個過程你應該從這裏開始。 http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –
哎唷!聽聽你說過的話。將盡力做得更好。在這裏找到了很多答案,所以這是我轉身的第一個地方之一。 – cjs