2

我正在尝试完成一些在 MS Excel 中看起来应该很简单的事情。我想使用单个 SQL 查询——所以我可以将它传递给其他人进行复制和粘贴——尽管我知道以下也可以通过其他方法实现。表 1 如下所示:

ID        value          value_type
1         minneapolis    city_name
2         cincinnati     city_name

我希望 SQL 查询返回这两行的“爆炸”版本:

ID        attr_name      attr_value
1         value          minneapolis
1         value_type     city_name
2         value          cincinnati
2         value_type     city_name

我需要做的还有很多,但这个概念是问题的核心。我尝试了一个SELECT语句,但似乎无法让它从一个创建两行,并且当我尝试使用时UNION ALL出现语法错误。

在 Microsoft Query 中,如何构造 SQL 语句以从一行中的现有值创建两行?

更新

感谢你目前的帮助。首先,作为参考,这里是在 Microsoft Query 中重新创建表的默认语句:

SELECT
    `Sheet3$`.ID,
    `Sheet3$`.name,
    `Sheet3$`.name_type
FROM `path\testconvert.xlsx`.`Sheet3$` `Sheet3$`

所以,在@lad2025 的带领下,我有:

SELECT
   ID = `Sheet3$`.ID
   ,attr_name  = 'value'
   ,attr_value = `Sheet3$`.value
FROM `path\testconvert.xlsx`.`Sheet3$` `Sheet3$`
UNION ALL
SELECT 
    ID = `Sheet3$`.ID
    ,attr_name  = 'value_type'
    ,attr_value = `Sheet3$`.value_type
FROM `path\testconvert.xlsx`.`Sheet3$` `Sheet3$`

结果就是这个错误Too few parameters. Expected 4.

4

2 回答 2

2

现场演示

CREATE TABLE #mytable(
   ID         INTEGER  NOT NULL PRIMARY KEY 
  ,value      VARCHAR(11) NOT NULL
  ,value_type VARCHAR(9) NOT NULL
);
INSERT INTO #mytable(ID,value,value_type) VALUES (1,'minneapolis','city_name');
INSERT INTO #mytable(ID,value,value_type) VALUES (2,'cincinnati','city_name');


SELECT 
    ID
   ,[attr_name]  = 'value'
   ,[attr_value] = value
FROM #mytable
UNION ALL
SELECT 
    ID
   ,[attr_name]  = 'value_type'
   ,[attr_value] = value_type
FROM #mytable
ORDER BY id;
于 2015-10-08T16:41:12.350 回答
0

好的,在回到原始声明并根据@lad2025 的建议从那里开始工作之后,我提出了这个声明,它实现了我在最初的问题中寻找的内容:

SELECT 
    ID,
    'name' AS [attr_name],
    name AS [attr_value] 
FROM `path\testconvert.xlsx`.`Sheet3$` `Sheet3$`
UNION ALL
SELECT 
    ID,
    'name_type',
    name_type
FROM `path\testconvert.xlsx`.`Sheet3$` `Sheet3$`
ORDER BY ID;

其中一个主要问题是新列名仅在第一条SELECT语句中定义。此外,括号还可以,只是 @lad2025 最初是如何使用它们的。

Microsoft Query 非常挑剔。

于 2015-10-08T19:34:44.220 回答