SQL-是否可以按行定制列值?

时间:2018-07-06 18:33:01

标签: mysql sql

有人知道是否有可能像下面的表格那样旋转。.仍然可以使用SELECT查询。

+----+-----------+---------------+------------+
| id | listingId | value         | identifier |
+----+-----------+---------------+------------+
| 1  | 1a        | Alaskan Husky | race       |
| 2  | 1a        | High          | activity   |
| 3  | 1a        | White         | colour     |
| 4  | 1b        | Akita         | race       |
| 5  | 1b        | Medium        | activty    |
| 6  | 1b        | Grey          | colour     |
+----+-----------+---------------+------------+

对于这样的事情,同时仍然可以使用选择查询。

+----+-----------+---------------+---------+--------+
| id | listingId | race          | activty | colour |
+----+-----------+---------------+---------+--------+
| 1  | 1a        | Alaskan Husky | High    | White  |
| 2  | 1b        | Akita         | Medium  | Grey   |
+----+-----------+---------------+---------+--------+

我还希望能够搜索这个新的“表”。假设用户选择了一个类似这样的过滤器:

  • 种族:阿拉斯加雪橇犬
  • 活动:中,高

然后应返回1a的listingId。

这样做的原因是,当所有值都放在不同的行中时,我无法执行正确的 SELECT 查询。

如您所见, listingId 应该是将所有变量分组在一起的变量,并在 identifier 列(新列)中添加值。

之所以我不只是将第二个表用作默认表,是因为每个列表可以具有不同的过滤器和过滤器组。而且我需要能够选择满足用户指定过滤条件的特定列表。

谢谢。

3 个答案:

答案 0 :(得分:2)

您可以使用条件聚合:

select min(id) id, listingId, 
       max(case when [identifier] = 'race' then [value] end) race,
       max(case when [identifier] = 'activity' then [value] end) activity,
       max(case when [identifier] = 'colour' then [value] end) colour
from table t
group by listingId;

答案 1 :(得分:1)

这可能会成功,只需几个自我连接即可。我认为您可以通过几种方法来完成此操作,但是对我来说,这很容易阅读和维护。

CREATE TABLE [dbo].[the_table](
    [id] [int] NULL,
    [listingId] [varchar](50) NULL,
    [value] [varchar](50) NULL,
    [identifier] [varchar](50) NULL
) ON [PRIMARY]
GO

INSERT INTO the_table (id, listingId, value, identifier)
VALUES  (1, '1a', 'alaskan huskey', 'race'),
        (2, '1a', 'high', 'activity'),
        (3, '1a', 'white', 'colour'),
        (4, '1b', 'akita', 'race'),
        (5, '1b', 'medium', 'activity'),
        (6, '1b', 'grey', 'colour')

SELECT * FROM 
(SELECT a.id, a.listingID, a.value AS race, b.value as activity, c.value as colour
FROM the_table a
INNER JOIN the_table b
ON a.listingId  = b.listingId 
INNER JOIN the_table c
ON a.listingId  = c.listingId 
WHERE a.identifier = 'race'
AND b.identifier = 'activity'
AND c.identifier = 'colour') AS t
WHERE t.colour = 'white'

输出:

results

答案 2 :(得分:0)

您可以使用Pivot

实现它
DECLARE @MyTable TABLE (Id INT, listingId VARCHAR(20),Value  VARCHAR(20), identifier varchar(20))
INSERT INTO @MyTable VALUES
(1,'1a','Alaskan Husky' ,'race'),
(2,'1a','High' ,'activity'),
(3,'1a','White'  ,'colour'),
(4,'1b','Akita' ,'race'),
(5,'1b','Medium','activity'),
(6,'1b','Grey' ,'colour')

SELECT *
FROM
(
SELECT listingId, identifier,Value FROM @MyTable)t
PIVOT(MIN(Value)
      FOR identifier
      IN (race,activity,colour)
      )p