GROUP BY多种数据类型

时间:2017-05-19 13:58:48

标签: sql group-by max case type-conversion

我有一个包含两列FieldName和FieldValue的表,它们都是varchar。 FieldName / FieldValue可以是到期日期或数量,如下所示:

enter image description here

我想选择所有行并按最大数量和最大到期日期对它们进行分组,最好不要使用UNION将其拆分。

我尝试了以下但收到了“操作数类型冲突:数字与日期不兼容”

SELECT
    FieldName, 
    CASE FieldName
        WHEN 'Quantity'
            THEN MAX(CAST(FieldValue AS NUMERIC))
        WHEN 'Expiry'
            THEN MAX(CAST(FieldValue AS DATE))
    END AS FieldValue
FROM MyTable
GROUP BY FieldName;

是否可以混合这样的数据类型?

3 个答案:

答案 0 :(得分:1)

最好这样做 - 你只有2个值用于分组:

SELECT 'Quantity' AS Type, CAST(MAX(CAST(FieldValue  AS NUMERIC)) AS VARCHAR) AS MaxValue
  FROM MyTable WHERE FieldName='Quantity'
UNION 
  SELECT 'Expiry', CAST(MAX(CAST(FieldValue  AS DATE)) AS VARCHAR)
    FROM MyTable WHERE FieldName='Expiry'

通常,将不同类型的值放在同一列中是个坏主意。您可以将FieldName的当前值(Qty / Exp)和其他2列作为Quantity,将其中一列作为Expiry,可能为空(NULL)值。

答案 1 :(得分:0)

没有。
您标记为“FieldValue”的列必须具有给定的数据类型。你把两种不同的类型合二为一!

如果您需要同时拥有这两个值,请考虑以下事项:

.bind

答案 2 :(得分:0)

嗨,试试这个 -

select FieldName,
CASE 
WHEN FieldName = 'Quantity' THEN   
  cast((select max(cast(FieldValue as numeric)) from #tmp where 
FieldName='Quantity') as varchar)
else
 cast((select max(cast(FieldValue as date)) from #tmp where 
 FieldName='Expiry') as varchar)
end  as 'New'
from MyTable