与选择查询
分组在上壳体和下壳体相同的值在下面的表InputParameterName列包含产品1(P大写)和产品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列有产品1(P大写)和(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;
使用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
LOWER(InputParameterName)将所有的值转换为小写..我不能做任何转换,需要得到两者之间的任何一个(产品1或产品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
我不能做任何转换到Lower或Upper,我想得到两个中的任何一个:( –
@thingguy ......确切地说,这只对'GROUP BY'进行转换,'SELECT'返回其中一个值 –
与上述查询我得到了同样的结果,因为我得到了... –