如何在MS Access SQL中从一列按不同筛选生成两列?
解决方案:行转列实现需求
你的问题本质是行转列(将同一Product-code下不同Criteria的Value转为独立列),原SQL的核心问题是缺少聚合函数,导致会返回多条记录,同时JOIN语句存在语法错误(public_dosa.product_code) 多了一个右括号)。
方法1:使用聚合函数 + IIF(适用于Access等支持IIF的数据库)
通过GROUP BY按Product-code分组,用MAX(或SUM,如果同一Product-code+Criteria不会重复的话)聚合IIF的结果,就能把多行合并为一行:
SELECT prp.[Product-code] AS Product_code, MAX(IIF(prp.Criteria = "Blue Grid", prp.Value, NULL)) AS [Blue Grid], MAX(IIF(prp.Criteria = "Red Grid", prp.Value, NULL)) AS [Red Grid] FROM public_report_product prp INNER JOIN public_dosa pd ON pd.product_code = prp.[Product-code] WHERE prp.Criteria IN ("Blue Grid", "Red Grid") GROUP BY prp.[Product-code];
说明:
MAX函数会筛选出每个分组下非NULL的Value(不符合条件的IIF返回NULL,MAX会忽略NULL)GROUP BY prp.[Product-code]确保每个产品只返回一行- 修正了JOIN语句的语法错误,同时用表别名简化代码
方法2:使用PIVOT(适用于SQL Server、PostgreSQL等支持PIVOT的数据库)
如果你的数据库支持PIVOT语法,代码会更简洁:
SQL Server版本:
SELECT Product_code, [Blue Grid], [Red Grid] FROM ( SELECT prp.[Product-code] AS Product_code, prp.Criteria, prp.Value FROM public_report_product prp INNER JOIN public_dosa pd ON pd.product_code = prp.[Product-code] WHERE prp.Criteria IN ("Blue Grid", "Red Grid") ) AS SourceTable PIVOT ( MAX(Value) FOR Criteria IN ([Blue Grid], [Red Grid]) ) AS PivotTable;
PostgreSQL版本(需先安装tablefunc扩展):
-- 先启用扩展 CREATE EXTENSION IF NOT EXISTS tablefunc; SELECT product_code, "Blue Grid", "Red Grid" FROM crosstab( 'SELECT prp."Product-code", prp.Criteria, prp.Value FROM public_report_product prp INNER JOIN public_dosa pd ON pd.product_code = prp."Product-code" WHERE prp.Criteria IN (''Blue Grid'', ''Red Grid'') ORDER BY 1,2', 'VALUES (''Blue Grid''), (''Red Grid'')' ) AS ct(product_code VARCHAR, "Blue Grid" NUMERIC, "Red Grid" NUMERIC);
最终结果
执行上述任意方法后,都会得到你期望的输出:
| Product-code | Blue Grid | Red Grid |
|---|---|---|
| 10184149 | 12.0 | 13.0 |
内容的提问来源于stack exchange,提问作者Sebfch
相关产品推荐
相关产品推荐

