2017-08-11 10 views
2

我有一個像SQL Server中附加圖像的表。基於SQL中的一個數字列檢索排序的數據

Sql table

我試圖找回基於SUM(freight)列排序的數據。爲此,我使用了下面的查詢。

SELECT ShipCountry 
FROM CountryDetails 
GROUP BY ShipCountry 
ORDER BY SUM(freight) ASC 

當我運行此我得到的結果如下圖所示。

SQL result

如果我運行下面的查詢我得到的結果如下圖所示。沒關係。

SELECT ShipCountry, ShipCity 
FROM CountryDetails 
GROUP BY ShipCountry, ShipCity 
ORDER BY SUM(Freight), ShipCity ASC 

enter image description here

取而代之的是我需要一個像下面的結果。按條款SUM(Freight)的順序應僅考慮ShipCountry。它不應該考慮ShipCountryShipCity。我的預期結果是

Tableau image

如何實現通過SQL查詢這個結果?

回答

1

您可以嘗試像下面

select 
    ShipCountry, 
    ShipCity 
from 
(
Select 
    ShipCountry, 
    ShipCity, 
    SUM(Freight) OVER(Partition by ShipCountry order by ShipCountry) NetCountry, 
    SUM(Freight) OVER(Partition by ShipCountry,ShipCity order by ShipCountry) NetCity 

from 
    CountryDetails 
) T 
Order by NetCountry asc,ShipCity asc 

Live Demo

+0

是的。它返回結果像我預期的那樣。還有一個疑問是,如果我運行下面的查詢,我得到了冗餘數據的結果。 從CountryDetails選擇ShipCountry按SUM(運費)結算(由ShipCountry劃分) 如果我添加group by子句,我收到錯誤消息。 從國家詳情組中選擇ShipCountry組按國家/地區排序按SUM(貨運)劃分(ShipCountry劃分) 可以在沒有獲取冗餘數據的情況下獲得相同的結果嗎? –

0

我覺得CUBEROLLUP將幫助您達到結果的查詢。但是請找到我創建的下面的查詢。我剛剛從你共享的模型創建了查詢。我無法保證表現。也請忽略第一欄和最後一欄。

; 

WITH CTE_ShipDetails1 
AS (
    SELECT ShipCountry 
     , MIN(ShipCity) ShipCity 
     , SUM(Freight) NetCity 
     , 0 RowNum 
    FROM CountryDetails 
    GROUP BY ShipCountry 
    ) 
, CTE_ShipDetails2 
AS 
(
SELECT CTE1.ShipCountry ShipCountry1 
     , NULL ShipCountry 
     , CountryDetails.ShipCity 
     , ROW_NUMBER() OVER (
      ORDER BY CTE1.ShipCountry 
       , CTE1.ShipCity 
      ) RowNum 
     , SUM(Freight) OVER(PARTITION BY CountryDetails.ShipCountry, CountryDetails.ShipCity) NetCity 
    FROM CountryDetails 
     , CTE_ShipDetails1 CTE1 
    WHERE CTE1.ShipCountry = CountryDetails.ShipCountry 
     AND CTE1.ShipCity <> CountryDetails.ShipCity 
)  
SELECT DISTINCT ShipCountry1, ShipCountry 
    , ShipCity, NetCity, MIN(RowNum) RowNum 
FROM 
(
SELECT TOP 250000 ShipCountry ShipCountry1, ShipCountry 
    , ShipCity, NetCity, RowNum 
FROM CTE_ShipDetails1 CTE1 UNION 
SELECT TOP 250000 ShipCountry1, ShipCountry 
    , ShipCity, NetCity, RowNum 
FROM CTE_ShipDetails2 CTE2 

) AS a GROUP BY ShipCountry1, ShipCountry 
    , ShipCity, NetCity 
ORDER BY ShipCountry1 ASC 
    , RowNum ASC 

    ;