2016-05-25 4 views
0

以下のクエリを使用して、特定の日付に必要な正しい結果をすべて表示します。 (月+年)の一部を変換して別の形式に変換して使用できると仮定していましたが、現在は05として表示されています/ 2016(103)、私は表示される結果を得るために、2016から05パーセントとして(120)を検索できるようにする必要がある。 コードは、アクセスVBAフォームの内部に配置される。(RIGHT(120)として結果を表示するには、varchar 103〜120 DATETIMEの部分を変換します。

SELECT 
    os.shop, os.prefix, 
    Rep_date AS FDate, 
    SUM(RC) AS Fulfilled, 
    SUM(RF) AS Refunded, 
    SUM(OS) AS TotalOS, 
    SUM(CA) AS TotalCA, 
    SUM(RET) AS TotalRET, 
    SUM(LOST) AS TotalLOST, 
    SUM(SHOR) AS TotalSHOR, 
    SUM(Total) AS Total, 
    CAST((CAST(SUM(RC) AS DECIMAL(9, 4))/CAST(SUM(Total) AS DECIMAL(9, 4))) AS DECIMAL(9, 4)) AS RCPC, 
    CAST((CAST(SUM(RF) AS DECIMAL(9, 4))/CAST(SUM(Total) AS DECIMAL(9, 4))) AS DECIMAL(9, 4)) AS RFPC, 
    CAST((CAST(SUM(OS) AS DECIMAL(9, 4))/CAST(SUM(Total) AS DECIMAL(9, 4))) AS DECIMAL(9, 4)) AS OSPC, 
    CAST((CAST(SUM(CA) AS DECIMAL(9, 4))/CAST(SUM(Total) AS DECIMAL(9, 4))) AS DECIMAL(9, 4)) AS CAPC, 
    CAST((CAST(SUM(RET) AS DECIMAL(9, 4))/CAST(SUM(Total) AS DECIMAL(9, 4))) AS DECIMAL(9, 4)) AS RETPC, 
    CAST((CAST(SUM(LOST) AS DECIMAL(9, 4))/CAST(SUM(Total) AS DECIMAL(9, 4))) AS DECIMAL(9, 4)) AS LOSTPC, 
    CAST((CAST(SUM(SHOR) AS DECIMAL(9, 4))/CAST(SUM(Total) AS DECIMAL(9, 4))) AS DECIMAL(9, 4)) AS SHORPC, 
    SUM(Orders) AS TotalOrders, 
    SUM(AmazonShipped) AS AmazonShipped, 
    SUM(AmazonCancelled) AS AmazonCancelled, 
    SUM(AmazonUnshipped) AS AmazonUnshipped, 
    CAST((CAST(SUM(AmazonShipped) AS DECIMAL(9, 4))/CAST(SUM(Orders) AS DECIMAL(9, 4))) AS DECIMAL(9, 4)) AS AmazonShippedPC, 
    CAST((CAST(SUM(AmazonCancelled) AS DECIMAL(9, 4))/CAST(SUM(Orders) AS DECIMAL(9, 4))) AS DECIMAL(9, 4)) AS AmazonCancelledPC, 
    CAST((CAST(SUM(AmazonUnshipped) AS DECIMAL(9, 4))/CAST(SUM(Orders) AS DECIMAL(9, 4))) AS DECIMAL(9, 4)) AS AmazonUnshippedPC, 
    p.Description 
FROM 
    OrderStatusSummary os 
LEFT JOIN 
    Prefix p ON os.prefix = p.prefix 
GROUP BY 
    Rep_date, os.shop, os.prefix, p.Description 
HAVING 
    (CAST(CONVERT(nvarchar(10), Rep_date, 120) AS DATETIME) = CONVERT(DATETIME, '25/05/2016', 103)) 
ORDER BY 
    CAST(CONVERT(nvarchar(10), Rep_date, 120) AS DATETIME) DESC 

上記で完全な日付で検索する手段として機能する場合、以下は私はあなたが何を達成しようとしているのかを示すために、月/年だけで検索するために使用しようとしました。しかし、それは動作していません。

HAVING (RIGHT(CONVERT(nvarchar(10), Rep_date, 103),7) = '05/2016') 

私が変更したコードの一部は、トップブロックと比較してHAVINGです。

+0

「HAVING」句は、集合関数の条件を対象としています。おそらく、派生テーブル(またはcte)を用意する必要がありますか? – jarlh

+0

テーブルの変更は不運にも私のコントロール外です。 –

+1

派生テーブルは、単なるエイリアスを持つサブクエリです。 –

答えて

0

私は新鮮な頭で、数日後にそれに戻ってきた後、自分の質問に答えています。..

Rep_dateは日付フィールドではなくテキストフィールドなので、日付変換は必要ありません。

HAVING LEFT(Rep_date, 7) = '2016-05' 

うまく動作します。

1

ステップ1 - vbaコードでstartDateおよびendDateという2つの変数を作成します。問題の年月の最初の日をstartDateにし、翌月の最初の日をendDateにします。

ステップ2 - このロジックを持つSQLのクエリパラメータとしてこれらの変数を使用します。

where rep_date >= startDate 
and rep_date < endDate 
関連する問題