2017-05-02 36 views
0

我很樂觀,一些聰明的SQL作者可以調整我的查詢以提供我期待的結果。我必須提取目前的稅率爲一個國家和不同稅種(PST/QST/GST/HST)通常每個州有PST/GST或HST。查看下面的數據表,我需要獲得「短名稱」,「名稱」和「生效日期」的不同值的稅率。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

如果我正確理解問題,我們可以爲每個唯一配對的短名稱和名稱順序分配一個行號按生效日期降序播出,因此最高日期是第一次。然後我們只顯示每個唯一配對的短名和姓名的第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 – GDutton

+0

中使用'With'並非所有引擎都支持它。 Oracle,SQL Server,DB2和Postgresql的當前版本(以及每個版本的一個或兩個)都可以,但mySQL不會。它也可以作爲一個子查詢,但我喜歡CTE的可讀性,並顯示我沒有真正改變你的代碼,只是添加了row_number()行。 CTE =通用表格表達式,你可以將它想像成任何東西......如果你想要的話,就像'ACTIVE_TAX_RATES':P – xQbert