我试图在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.
答案 0 :(得分:2)
<强> LiveDemo 强>
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;
答案 1 :(得分: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非常挑剔。