2016-05-03 7 views
0

毎月リストを取得するコードを作成しようとしています。このリストは顧客ごとに複数のレコードを取得し、集計されたさまざまな情報を持つ顧客ごとに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_] 
+1

このフォーマットでは、私の眼球を取り出して、サンドブラストで撃ってほしいと思っています。時々エイリアスは同じ行にあり、それ以外のときはエイリアスは同じ行にあります。あなたのSQLをクリーンアップする10分を費やすことは、ステップ1になります。ステップ2はオンラインフォーラムの助けを得ています。このプロセスではここから始めてください。 http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

+0

おっと!あなたが言ったことを聞いてください。より良くしようとします。ここではたくさんの回答が見つかりましたので、私が最初に回した場所の1つでした。 – 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

関連する問題