【问题标题】:SUM(CASE WHEN Products.ProductID in (show which product matched) SQLSUM(CASE WHEN Products.ProductID in (显示匹配的产品) SQL
【发布时间】:2014-09-02 17:58:57
【问题描述】:

这是我当前的 SQL 语句

SELECT
  Customers.Customer,
  SUM(CASE WHEN Products.ProductID in ('ab6','ab5','ab4','ab3','ab2','ab1','abc'.......many others THEN 1 ELSE 0 END) AS Product_10,
FROM Customers
INNER JOIN Products ON Customers.ProductID = Products.ProductID
GROUP BY Customers.Customer

所以基本上它会计算这些项目,但我希望结果显示它与哪一项匹配,无论是全部还是其中一项。这可能吗?

【问题讨论】:

  • 您希望它如何列出匹配的对象?单独的行?逗号分隔列表?什么关系型数据库? (MSSQL?ORacle,DB2?mySQL?)这将有助于理解您的预期输出。
  • 你用的是什么数据库?

标签: sql count case


【解决方案1】:

大多数数据库都有组合字符串的方法。在MySQL中,函数是group_concat(),所以你可以得到你想要的:

SELECT c.Customer,
       SUM(CASE WHEN p.ProductID in ('ab6','ab5','ab4','ab3','ab2','ab1','abc'.......many others THEN 1 ELSE 0 END) AS Product_10,
       GROUP_CONCAT(DISTINCT p.ProductId)
FROM Customers c INNER JOIN
     Products p
     ON c.ProductID = p.ProductID
GROUP BY c.Customer;

顺便说一句,您的数据模型有问题。您的查询表明客户可以在Customers 表中拥有多行。这似乎不对。 Customer 应该是这个表的主键。您缺少用于在客户和产品之间映射的连接表,我将其称为 CustomerProducts

【讨论】:

    【解决方案2】:
    SELECT
      Customers.Customer,
      Products.ProductID,
      SUM(CASE WHEN Products.ProductID in ('ab6','ab5','ab4','ab3','ab2','ab1','abc'.......many others THEN 1 ELSE 0 END) AS Product_10,
    FROM Customers
    INNER JOIN Products ON Customers.ProductID = Products.ProductID
    WHERE Products.ProductID in ('ab6','ab5','ab4','ab3','ab2','ab1','abc'......)
    GROUP BY Customers.Customer, Products.ProductID
    

    【讨论】:

      【解决方案3】:
      SELECT Customers.Customer, Products.ProductID, COUNT(1) as Product_10
      FROM Customers
      INNER JOIN Products 
          ON Customers.ProductID = Products.ProductID
      WHERE Products.ProductID in ('ab6','ab5','ab4','ab3','ab2','ab1','abc'.......many others)
      GROUP BY Customers.Customer, Products.ProductID
      

      如果您的 DBMS 支持,您可以通过分组集获得每个客户的总数:

      SELECT Customers.Customer, coalesce(Products.ProductID, 'Total'), COUNT(1) as Product_10
      FROM Customers
      INNER JOIN Products 
          ON Customers.ProductID = Products.ProductID
      WHERE Products.ProductID in ('ab6','ab5','ab4','ab3','ab2','ab1','abc'.......many others)
      GROUP BY GROUPING SETS ((Customers.Customer, Products.ProductID),(Customers.Customer));
      

      Group by Rollup 和 Group by Cube 可能是您感兴趣的其他构造

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-27
        • 2021-08-18
        • 2011-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-14
        相关资源
        最近更新 更多