2017-08-11 8 views
2

SQLサーバーに添付されたイメージのような表があります。SQLの1つの数値列に基づいてソートされたデータを取得します

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

私は以下のような結果を必要としています。順序では、ShipCountryだけを考慮する必要がありますSUM(Freight)節で。 ShipCountryShipCityの両方を考慮する必要はありません。私の期待される結果は、SQLクエリによって、この結果を達成するためにどのように

Tableau image

のですか?

答えて

1

あなたは、私がCUBEまたはROLLUPが結果を達成するためにあなたを助けるだろうと思い

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

はい。私は期待どおりの結果を返します。もう1つの疑問は、私は以下のクエリを実行する場合私は冗長なデータを持つ結果を持っている。 国名からShipCountryを選択します。SUM(貨物)でオーダーします。 私がgroup by節を追加すると、エラーメッセージが表示されます。 土地別にCountryDetailsグループからShipCountryを選択してくださいSUM(貨物)でオーダー これは冗長データを取得せずに同じことを得ることが可能ですか? –

0

以下のようなクエリを試すことができます。しかし、私が作成した以下のクエリを見つけてください。私は共有したモデルからクエリを作成しました。私はパフォーマンスを保証することはできません。また、最初と最後の列を省略してください。

; 

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 

    ; 
関連する問題