毎月リストを取得するコードを作成しようとしています。このリストは顧客ごとに複数のレコードを取得し、集計されたさまざまな情報を持つ顧客ごとに1行を返すように結果セットが必要です。顧客ごとに複数のレコードから1行の月別リストを作成する
したがって、次のコードを実行すると、Max
の日付の正しい回答が得られ、その顧客の最後の請求書が返され、残っている請求書を合計する合計金額に適切な回答が得られます。アカウントの経年変化を示すその他のフィールドがあります。しかし、各行に2つの集計フィールドに対する「正しい」回答が表示されている請求書があるので、顧客あたりの行数が増えています。
私は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_]
このフォーマットでは、私の眼球を取り出して、サンドブラストで撃ってほしいと思っています。時々エイリアスは同じ行にあり、それ以外のときはエイリアスは同じ行にあります。あなたのSQLをクリーンアップする10分を費やすことは、ステップ1になります。ステップ2はオンラインフォーラムの助けを得ています。このプロセスではここから始めてください。 http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –
おっと!あなたが言ったことを聞いてください。より良くしようとします。ここではたくさんの回答が見つかりましたので、私が最初に回した場所の1つでした。 – cjs