2017-06-16 168 views
0

分組在上殼體和下殼體相同的值在下面的表InputParameterName列包含產品1P大寫)和產品1ř大寫)。與選擇查詢

表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大寫)和(R大寫字母)。

有沒有什麼辦法讓兩者爲一致,無論是產品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,以便在涉及字符串的表達式中忽略大小寫。

編輯:

如果上述結果返回兩行,則情況不是問題。你可能有隱藏的字符。最有可能的是空格,所以你可以嘗試:

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

希望隱藏的空間並不比空間更加複雜。

編輯II:

我現在明白了。你想要兩行,你只是想要的值是相同的。然後,窗口功能可以做你想做什麼:

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,我想得到兩個中的任何一個:( –

+1

@thingguy ......確切地說,這隻對'GROUP BY'進行轉換,'SELECT'返回其中一個值 –

+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)將所有的值轉換爲小寫..我不能做任何轉換,需要得到兩者之間的任何一個(產品1或產品1) –

+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