与选择查询

与选择查询

问题描述:

分组在上壳体和下壳体相同的值在下面的表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(不应用任何字符大小写转换的精确值)?

使用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

与上述查询我得到了同样的结果,因为我得到了... –

使用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

我已经更新了这个问题......希望现在清楚。 –

通过使用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