繁体   English   中英

SQL查询根据行数确定列

[英]SQL query to determine the column based on count of rows

如果在同一天购买了多个项目,需要帮助在购买表上编写 SQL 查询并将“项目”列更改为“多”:

这是示例表:

name | date       | item 
-------------------------
Jack | 20120105   |  TV
Jack | 20120105   |  Table
Jack | 20120105   |  Chair
Ryan | 20170822   |  TV
Roma | 20190525   |  TV
Bill | 20110121   |  Table

例如,上表中的 Jack 在同一天有多次购买,因此希望“item”列的结果为“Multi”:

name | date       | item 
-------------------------
Jack | 20120105   |  Multi
Ryan | 20170822   |  TV
Roma | 20190525   |  TV
Bill | 20110121   |  Table

此查询有效,但如果同一个人在同一天购买了 2 件以上的商品,该怎么办:

select name
       case when p1.item <> p2.item then 'U'
             else p1.item
             end as item_name
from purchases p1 join purchases p2 on (p1.name = p2.name)

还有其他更好的方法来实现这一目标吗?

谢谢!

使用聚合和case表达式:

select name, date,
       (case when min(item) = max(item) then min(item)
             else 'Multi'
        end) as item_name
from purchases
group by name, date;

您可以使用EXISTS子句与SELECT DISTINCT改变itemMulti ,当不止一个项目在同一天购买的:

SELECT DISTINCT name, date,
       CASE WHEN EXISTS (SELECT *
                         FROM purchases p2 
                         WHERE p2.name  = p1.name
                           AND p2.date  = p1.date
                           AND p2.item != p1.item) THEN 'Multi'
            ELSE item 
        END AS item
FROM purchases p1

另一种选择是汇总并检查某个人在某一天购买的COUNT件商品:

SELECT name, date, 
       CASE WHEN COUNT(*) > 1 THEN 'Multi'
            ELSE MIN(item)
       END AS item
FROM purchases
GROUP BY name, date

在这两种情况下,输出都是:

name    date        item
Jack    20120105    Multi
Ryan    20170822    TV
Roma    20190525    TV
Bill    20110121    Table

SQLFiddle 上的演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM