【问题标题】:Display recurring column values once with second column unchanged显示重复列值一次,第二列不变
【发布时间】:2019-11-26 17:36:53
【问题描述】:

所以我要做的是显示一列“客户名称”,只显示一次客户的姓名,第二列“购买的产品”显示客户购买的所有产品。比如说,鲍勃买了一辆汽车、一部手机和一块手表;我要显示的是什么

'''''''''''''''''''''''
'Customer  'Product   '
'Name      'Purchased '
'''''''''''''''''''''''
'Bob       'Car       '
'          'Phone     '
'          'Watch     '
'''''''''''''''''''''''

现在我的声明是

SELECT 
    Customers.Name AS 'Customer Name',
    Items.ItemName AS 'Product'
FROM
    Orders
        INNER JOIN
    Customers ON Orders.CustomerID = Customers.CustomerID
        INNER JOIN
    Items ON Orders.ItemID = Items.ItemID;

它会显示客户表中的所有名称及其购买的相应产品,但它与客户的名称重复。

有什么办法吗?

【问题讨论】:

  • 不管怎样,这种报告格式通常最好在您的应用程序中完成,而不是在 dbms 中完成。

标签: sql database


【解决方案1】:

您可以使用子查询来确定每一行是否是该客户的第一个订单:

SELECT 
    CASE WHEN NOT EXISTS (
        SELECT 1 FROM Orders o2
        WHERE o2.CustomerID = Orders.CustomerID AND o2.OrderID < Orders.OrderID
    ) THEN Customers.Name ELSE '' END AS 'Customer Name',
    Items.ItemName AS 'Product'
FROM
    Orders
        INNER JOIN
    Customers ON Orders.CustomerID = Customers.CustomerID
        INNER JOIN
    Items ON Orders.ItemID = Items.ItemID
ORDER BY Customers.CustomerID, Orders.OrderID ASC;

【讨论】:

  • @7g3p 。 . .除了不必要的麻烦之外,如果客户的最低订单 ID 有多个项目,我认为这不会满足您的要求。
【解决方案2】:

您不会为此使用子查询。通常,这种类型的转换是在应用层完成的。但是如果你在数据库中做,使用row_number():

SELECT (CASE WHEN 1 = ROW_NUMBER() OVER (PARTITION BY o.CustomerId ORDER BY o.OrderId, i.ItemName)
             THEN c.Name
        END) as Customer_Name,
       i.ItemName AS Product
FROM Orders o JOIN
     Customers c
     ON o.CustomerID = c.CustomerID JOIN
     Items i
     ON o.ItemID = i.ItemID
ORDER BY c.CustomerID, o.OrderID ASC, i.itemName;

请注意,这使用了表别名,因此查询更易于编写和阅读。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-16
    • 2020-04-28
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多