【发布时间】:2015-11-17 20:20:10
【问题描述】:
我有一个相当简单的查询,用于获取车辆属性,例如年份、品牌和型号。目前的数据看起来与此类似...:
+------+------+-----------+-------+----------+------------------------------------------+
| SKU | Year | Make | Model | Submodel | Notes |
+------+------+-----------+-------+----------+------------------------------------------+
| 0001 | 1995 | Chevrolet | Astro | Base | Clear Lens; Chrome Housing; Pair; 1 pc.; |
| 0001 | 1995 | Chevrolet | Astro | CL | Clear Lens; Chrome Housing; Pair; 1 pc.; |
| 0001 | 1995 | Chevrolet | Astro | LS | Clear Lens; Chrome Housing; Pair; 1 pc.; |
| 0001 | 1996 | Chevrolet | Astro | Base | Clear Lens; Chrome Housing; Pair; 1 pc.; |
| 0001 | 1996 | Chevrolet | Astro | CL | Clear Lens; Chrome Housing; Pair; 1 pc.; |
| 0001 | 1996 | Chevrolet | Astro | LS | Clear Lens; Chrome Housing; Pair; 1 pc.; |
| 0001 | 1997 | Chevrolet | Astro | Base | Clear Lens; Chrome Housing; Pair; 1 pc.; |
| 0001 | 1997 | Chevrolet | Astro | LT | Clear Lens; Chrome Housing; Pair; 1 pc.; |
| 0001 | 2001 | Chevrolet | Astro | Base | Clear Lens; Chrome Housing; Pair; 1 pc.; |
+------+------+-----------+-------+----------+------------------------------------------+
当其他数据在行中匹配时(SKU、品牌、型号、子型号、备注),我想连接年份。最终结果的一个例子是这样的......:
+------+-------------+-----------+-------+----------+------------------------------------------+
| SKU | Year | Make | Model | Submodel | Notes |
+------+-------------+-----------+-------+----------+------------------------------------------+
| 0001 | 1995 - 1997 | Chevrolet | Astro | Base | Clear Lens; Chrome Housing; Pair; 1 pc.; |
| 0001 | 1995 - 1996 | Chevrolet | Astro | CL | Clear Lens; Chrome Housing; Pair; 1 pc.; |
| 0001 | 1995 - 1996 | Chevrolet | Astro | LS | Clear Lens; Chrome Housing; Pair; 1 pc.; |
| 0001 | 1997 | Chevrolet | Astro | LT | Clear Lens; Chrome Housing; Pair; 1 pc.; |
| 0001 | 2001 | Chevrolet | Astro | Base | Clear Lens; Chrome Housing; Pair; 1 pc.; |
+------+-------------+-----------+-------+----------+------------------------------------------+
查询当前看起来像...:
SELECT DISTINCT
sku,
YearID,
MakeName,
modelname,
SubmodelName,
notes
FROM
TableName
WHERE 1
在与我类似的示例中,向用户提供了一个指向查询中“CASE”用法的答案。提供的示例如下,但它在整个表格中获取了最小和最大年份。最终结果是这样的,只有一个结果...
+------+-------------+-----------+-------+----------+------------------------------------------+
| SKU | Year | Make | Model | Submodel | Notes |
+------+-------------+-----------+-------+----------+------------------------------------------+
| 0001 | 1950 - 2015 | Chevrolet | Astro | Base | Clear Lens; Chrome Housing; Pair; 1 pc.; |
+------+-------------+-----------+-------+----------+------------------------------------------+
示例查询(包括 CASE)...:
SELECT DISTINCT
sku,
CASE
WHEN MIN(YearID) = MAX(YearID)
THEN MIN(YearID)
ELSE CONCAT(MIN(YearID), '-', MAX(YearID))
END As Year,
MakeName,
modelname,
SubmodelName,
notes
FROM
TableName
WHERE 1
非常感谢您在获得我想要的结果方面的帮助。我一直不知道如何通过 SQL 做到这一点。
【问题讨论】:
-
我的第一个想法是把当年的
MIN和MAX串联起来,但这会像 1967 年制造的 Camaro 这样的东西咬你一口- 2002 年,然后一直中断到 2010 年。查询将返回'1967 - 2016',您实际上应该有两个单独的行,'1967 - 2002'和'2010-2016'。为了处理这个问题,我认为您需要一个游标来滚动记录集并检查年份间隔。然后我看到这是一个 mysql,不知道它是否支持游标等,并决定留下这个评论进一步解释问题。 -
感谢@LDMJoe 的帮助。您指出了我的一个担忧,我不确定如何让它发挥作用,或者是否可能以这种方式工作。感谢您花时间提供您的见解。 :-)
-
@LDMJoe 我在数据中没有看到这种情况
-
@JuanCarlosOropeza 没错,但这显然只是几行样本数据。我认为 OP 的完整数据是基于已知存在这种情况的现实世界数据。我刚刚看到了一个潜在的绊脚石并记下了它。 OP 可以决定是否需要对此进行解释,并相应地接受(或不接受)他自己的答案。
-
我已更改我的答案。请再试一次
标签: mysql sql concatenation