给出下表
+-----------------------------+
| id | type | price | item_id |
|-----------------------------|
| 1 | 1 | 20 | 22 |
|-----------------------------|
| 2 | 1 | 22 | 22 |
|-----------------------------|
| 3 | 2 | 19 | 22 |
|-----------------------------|
| 4 | 2 | 11 | 22 |
|-----------------------------|
| 5 | 1 | 08 | 22 |
|-----------------------------|
| 6 | 2 | 25 | 22 |
+-----------------------------+
我正在尝试选择数据以创建一行视图,如下所示
+-------------------------------------+
| type1_range | type2_range | item_id |
|-------------------------------------|
| 08 - 22 | 11 - 25 | 22 |
+-------------------------------------+
type1_range和type2_range是每种类型的最低和最高价格。
我可以使用几行获得数据
SELECT type, MAX (price) , MIN (price)
FROM table
where item_id=22 GROUP BY type;
+----------------------------+
| type | max | min | item_id |
|----------------------------|
| 1 | 22 | 08 | 22 |
|----------------------------|
| 2 | 25 | 11 | 22 |
+----------------------------+
但是我试图像这样合并行:
+-------------------------------------+
| type1_range | type2_range | item_id |
|-------------------------------------|
| 08 - 22 | 11 - 25 | 22 |
+-------------------------------------+
为此需要什么sql?
答案 0 :(得分:0)
类似这样的东西:
SELECT
CONCAT(
MIN(CASE WHEN type = 1 THEN price END),
' - ',
MAX(CASE WHEN type = 1 THEN price END)
) as type1range,
CONCAT(
MIN(CASE WHEN type = 2 THEN price END),
' - ',
MAX(CASE WHEN type = 2 THEN price END)
) as type2range.
item_id
FROM table
WHERE item_id = 22
GROUP BY item_id
您已经标记了两个不同的数据库系统(请避免这样做),但我相信它们都支持CONCAT()进行字符串连接
如果您要从选择列表中省略item_id(您已经知道它是22),则可以删除GROUP BY。或者,如果您删除WHERE并离开组,则每个item_id都会获得一行
要进一步了解其工作原理,请删除concat和最小/最大值-您会看到这种情况,只有当类型为1(在类型1范围内)时,价格才会显示列),否则为null。是的。最小和最大值对于每列仅处理类型1或类型2数据来说都是微不足道的。如果您想进一步阅读它们,它实际上是一种透视查询
答案 1 :(得分:0)
一种直接的方法是将type1_range和type2_range作为两个子查询,并使用如下所示的独特ID进行连接,
SELECT t.item_id,type1_range,type2_range
FROM (Select distinct item_id from table) t
LEFT join
(SELECT item_id,type, concat(MIN(price),'-' ,MAX(price) ) as type1_range
FROM table
where type=1
GROUP BY item_id,type)type1 on type1.item_id=t.item_id
LEFT join
(SELECT item_id,type, concat(MIN(price),'-' ,MAX(price) ) as type2_range
FROM table
where type=2
GROUP BY item_id,type)type2 on type2.item_id=t.item_id