2017-05-02 20 views
0

私は、賢明なSQL作成者が自分のクエリを微調整して私が探している結果を得ることができると楽観しています。私は、州および別個の税タイプ(PST/QST/GST/HST)の現在の税率を抽出する必要があります。通常、州ごとにPST/GSTまたはHSTがあります。以下のデータ表を見ると、「Shortname」、「name」、「Effective Date」の別個の値に対して税率を取得する必要があります。SQL税金テーブルから別個の税率を取得

所望の結果は、この表である:

EffectiveDate Rate ShortName name 
2016-01-01 0.050000 AB GST 
2013-04-01 0.050000 BC GST 
2013-04-01 0.070000 BC PST 
2013-07-01 0.050000 MB GST 
2013-07-01 0.080000 MB PST 
2016-07-01 0.150000 NB HST 
2016-07-01 0.150000 NL HST 
2016-01-01 0.150000 NS HST 
2016-01-01 0.050000 NT GST 
2016-01-01 0.050000 NU GST 
2015-04-01 0.130000 ON HST 
2016-10-01 0.150000 PE HST 
2013-01-01 0.050000 QC GST 
2017-03-01 0.099750 QC QST 
2016-01-01 0.050000 SK GST 
2017-03-01 0.060000 SK PST 
2009-02-01 0.050000 YT GST 

マイクエリー、これまで:

SELECT --TaxRates.ID, --TaxRates.StateId, TaxRateDetails.id, 
TaxRateDetails.EffectiveDate, TaxRateDetails.Rate,--TaxRateDetails.TaxRateId, 
States.ShortName, TaxImpositionTypes.name -- DISTINCT Name,states.ShortName, TaxRateDetails.Id,TaxImpositionTypeDetailId 
FROM dbo.TaxRates 
join dbo.TaxRateDetails ON TaxRateDetails.TaxRateId = TaxRates.Id 
INNER JOIN States ON dbo.TaxRates.StateId = States.Id AND States.IsActive =1 
INNER JOIN TaxImpositionTypeDetails ON TaxRateDetails.TaxImpositionTypeDetailId = TaxImpositionTypeDetails.Id 
INNER JOIN TaxImpositionTypes ON dbo.TaxImpositionTypeDetails.TaxImpositionTypeId = TaxImpositionTypes.Id 
WHERE EffectiveDate < CURRENT_TIMESTAMP 
order BY ShortName 

次のようにこのクエリによって作成されたこのソース表は次のとおりです。

EffectiveDate Rate ShortName name 
2016-01-01 0.050000 AB GST 
2009-02-01 0.050000 AB GST 
2013-04-01 0.050000 BC GST 
2013-04-01 0.070000 BC PST 
2013-04-01 0.050000 BC GST 
2013-04-01 0.070000 BC PST 
2013-07-01 0.050000 MB GST 
2013-07-01 0.080000 MB PST 
2010-07-01 0.130000 NB HST 
2016-07-01 0.150000 NB HST 
2010-07-01 0.130000 NB HST 
2009-02-01 13.000000 NL HST 
2016-07-01 0.150000 NL HST 
2010-07-01 0.130000 NL HST 
2016-01-01 0.150000 NS HST 
2010-07-01 0.150000 NS HST 
2016-01-01 0.050000 NT GST 
2009-02-01 0.050000 NT GST 
2016-01-01 0.050000 NU GST 
2009-02-01 0.050000 NU GST 
2010-07-01 0.130000 ON HST 
2009-02-01 0.050000 ON HST 
2009-02-01 0.080000 ON PST 
2010-03-01 0.130000 ON HST 
2015-04-01 0.130000 ON HST 
2015-04-01 0.000100 ON PST 
2009-02-01 13.000000 PE HST 
2013-04-01 0.140000 PE HST 
2016-10-01 0.150000 PE HST 
2013-01-01 0.050000 QC GST 
2013-01-01 0.010000 QC QST 
2012-01-01 0.050000 QC GST 
2012-01-01 0.095000 QC QST 
2017-03-01 0.099750 QC QST 
2016-01-01 0.050000 SK GST 
2016-01-01 0.050000 SK PST 
2009-02-01 0.050000 SK GST 
2009-02-01 0.050000 SK PST 
2017-03-01 0.060000 SK PST 
2009-02-01 0.050000 YT GST 
+0

ユニークなショートネーム、名前の組み合わせの最新の日付に最も高いレートが必要ですか? – xQbert

答えて

3

た場合、私は正しい質問を理解して、私たちは、ショートネームとネームオーダーの一意のペアごとに行番号を割り当てることができます発効日を指定して放映すると、最高の日付が最初に表示されます。次に、shortnameとnameの一意の各ペアの行1のみを表示します。

WITH CTE AS (
    SELECT TaxRateDetails.EffectiveDate 
     , TaxRateDetails.Rate 
     , States.ShortName 
     , TaxImpositionTypes.name 
     , Row_number() over (partition by States.ShortName,TaxImpositionTypes.name ORDER BY TaxRateDetails.EffectiveDate DESC) RN 
FROM dbo.TaxRates 
INNER JOIN dbo.TaxRateDetails 
    ON TaxRateDetails.TaxRateId = TaxRates.Id 
INNER JOIN States 
    ON dbo.TaxRates.StateId = States.Id 
    AND States.IsActive =1 
INNER JOIN TaxImpositionTypeDetails 
    ON TaxRateDetails.TaxImpositionTypeDetailId = TaxImpositionTypeDetails.Id 
INNER JOIN TaxImpositionTypes 
    ON dbo.TaxImpositionTypeDetails.TaxImpositionTypeId = TaxImpositionTypes.Id 
WHERE EffectiveDate < CURRENT_TIMESTAMP) 

SELECT * FROM CTE where RN = 1 
+0

ありがとう!すごいです!!!私はあなたがSQLで 'With'を使うことができるかどうかも知らなかった – GDutton

+0

すべてのエンジンがそれをサポートしているわけではありません。 Oracle、SQL Server、DB2、およびPostgreSQLの現行バージョン(およびそれぞれの1つまたは2つ前のバージョン)はすべて行いますが、mySQLは動作しません。サブクエリとして配置することもできますが、読みやすくするためにCTEが好きで、実際にコードを変更しないようにするには、row_number()行を追加しました。 CTE =あなたが必要とするものをエイリアスすることができる共通テーブル式...あなたが望むなら 'ACTIVE_TAX_RATES'のように:P – xQbert

関連する問題