获取单行中串联的值的范围(最小值-最大值)

时间:2019-03-06 03:37:46

标签: sql postgresql

给出下表

+-----------------------------+
| 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?

2 个答案:

答案 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