2017-06-16 6 views
0

で大文字と小文字に同じ値をグループ化InputParameterName列は製品1P大文字)と製品1R大文字)を含みます。以下の表では、SELECTクエリ

表1:

InputParameterName Period PeriodInput 
Product1    2017 25704 
Product1    2018 25704 
pRoduct1    2017 16 
pRoduct1    2018 16 
pRoduct1    2017 57.6 
pRoduct1    2018 57.6 
pRoduct1    2017 40.5 
pRoduct1    2018 40.5 

マイクエリ:

SELECT InputParameterName, Period, SUM(CAST(PeriodInput AS FLOAT)) PeriodInput 
FROM Table1   
GROUP BY InputParameterName, Period 

結果:

InputParameterName Period PeriodInput 
Product1     2017 25818.1 
pRoduct1     2018 25818.1 

結果では、あなたがInputParameterName列が製品1Pアッパーケースを持って見ることができます)およびpRoduct1R大文字)。

同じよう両方を取得する方法は、製品1または製品1(任意の文字ケース変換を適用せずに正確な値)のいずれかありますか?

答えて

2

使用lower()またはupper()

SELECT MIN(InputParameterName) as InputParameterName, Period, 
     SUM(CAST(PeriodInput AS FLOAT)) PeriodInput 
FROM Table1   
GROUP BY LOWER(InputParameterName), Period; 

GROUP BYでの使用LOWER()を定義します。このケースでは、派生テーブルを使用することができます。 SELECTでは使用されていないので、常にデータ内の値を取得します。

大文字小文字を区別しない場合は、列、表、またはデータベースのcollationの設定を調べて、文字列を含む式で大文字小文字が無視されるようにしてください。

EDIT:上記の結果は、2つの行を返す場合

、その後場合は問題ではありません。おそらく隠された文字があります。最も可能性の高いスペースではないので、あなたは試すことができます:

GROUP BY LOWER(REPLACE(InputParameterName, ' ', '')), Period; 

うまくいけば、隠されたスペースが全くスペースよりも複雑です。

編集II:

今すぐ取得します。 2つの行が必要な場合は、値を同じにします。そして、ウィンドウ関数は、あなたがやりたいことができます。

SELECT MIN(InputParameterName) OVER (PARTITION BY LOWER(InputParameterName)), 
     Period, SUM(CAST(PeriodInput AS FLOAT)) as PeriodInput 
FROM Table1   
GROUP BY InputParameterName, Period; 
+0

LowerまたはUpperに変換することはできません。私は2つのうちのいずれかを取得したいです:( –

+1

@thingguy。...正確にこれはGROUP BYの変換のみです。実際にデータ内の値 –

+0

上記のクエリと同じ結果を得ています... –

1

使用LOWER()

SELECT 
    LOWER(InputParameterName) AS InputParameterName, 
    Period, 
    SUM(CAST(PeriodInput AS FLOAT)) PeriodInput 
FROM Table1   
GROUP BY 
    LOWER(InputParameterName), 
    Period 

厳密にANSI準拠するように、我々はGROUP BY句の列の機能を使用しないでください。

WITH cte AS (
    SELECT 
     LOWER(InputParameterName) AS InputParameterName, 
     Period, 
     PeriodInput 
    FROM Table1 
) 
SELECT 
    InputParameterName, 
    Period, 
    SUM(CAST(PeriodInput AS FLOAT)) PeriodInput 
FROM cte  
GROUP BY 
    InputParameterName, 
    Period 
+0

LOWER(InputParameterName)すべての値を小文字に変換します。変換は何もできません.2つのうち1つを取得する必要があります(Product1またはproduct1)。 –

+0

あなたのコメントは理解できません。あなたの質問を更新し、あなたが念頭に置いていることを私たちに示してください。 –

+0

質問を更新しました。 –

1

をROW_NUMBER()およびパーティションオーバー '期間' 欄は、希望取得結果

;With cte(InputParameterName,Period,PeriodInput) 
    AS 
    (
    SELECT 'Product1', 2017,25704 Union all 
    SELECT 'Product1', 2018,25704 Union all 
    SELECT 'product1', 2017,16 Union all 
    SELECT 'product1', 2018,16 Union all 
    SELECT 'product1', 2017,57.6 Union all 
    SELECT 'product1', 2018,57.6 Union all 
    SELECT 'product1', 2017,40.5 Union all 
    SELECT 'product1', 2018,40.5 
    ) 
    SELECT InputParameterName,Period,PeriodInput FRom 
    (
    SELECT InputParameterName, 
      Period, 
      CAST(SUM(PeriodInput)OVER(Partition by Period Order BY Period) AS FLOAT)AS PeriodInput, 
      ROW_NUMBER()OVER(Partition by Period Order BY Period)AS Seq From cte  
    )DT 
    WHERE DT.Seq=1 

出力を用いて

InputParameterName Period PeriodInput 
-------------------------------------- 
product1   2017 25818.1 
product1   2018 25818.1 
関連する問題