【问题标题】:How to receive this result in SQL如何在 SQL 中接收此结果
【发布时间】:2016-09-12 10:03:04
【问题描述】:

我有两张表——客户和产品,我有 10 个客户和 5 个产品。

例如,我可以通过查询加入:

select 
    ca.id as customer_id,p.id as product_id
from 
    customeraccount ca  
left join 
    product p on ca.id = p.customeraccountid

如何接收类似于笛卡尔但不是笛卡尔的新表,如下所示:

Flaq 是一个变量,表示该客户是否拥有该产品。

【问题讨论】:

  • 请始终标记实际的 DBMS(供应商和版本)...
  • 添加一些示例表数据,作为格式化文本,以及预期的结果也作为格式化文本。
  • 同时添加表结构。
  • 好的!谢谢和抱歉;)

标签: sql


【解决方案1】:

CROSS JOIN 可以解决你的问题

SELECT ca.id as customer_id,
       p.id as product_id,
       CASE WHEN ca.id=p.customeraccountid THEN 1 ELSE 0 END AS Flag
FROM  customeraccount ca  
CROSS JOIN product p 

【讨论】:

    【解决方案2】:

    如果您有两张桌子,您应该重新考虑您的设计。您至少应该为您的客户准备一张桌子,一张用于您的产品,一张用于实际销售(或者您想在这里做的任何事情......)。

    由于您是这里的新手,请允许我给我一个提示:通过良好的MCVE 帮助 SO 社区。我在这里为您创建一个:

    SQL-Server 语法...

    DECLARE @customer TABLE(CustomerID INT);
    INSERT INTO @customer VALUES(1001),(1002),(1003);
    DECLARE @prod TABLE(ProdID INT);
    INSERT INTO @prod VALUES(1),(2),(3);
    DECLARE @sales TABLE(CustomerID INT,ProdID INT);
    INSERT INTO @sales VALUES(1001,1),(1001,3)
                            ,(1002,1),(1002,2)
                            ,(1003,2);
    
    SELECT c.CustomerID
          ,p.ProdID
          ,CASE WHEN s.CustomerID IS NULL THEN 0 ELSE 1 END AS HasSale 
    FROM @customer AS c
    CROSS JOIN @prod AS p
    LEFT JOIN @sales AS s ON s.ProdID=p.ProdID AND s.CustomerID=c.CustomerID
    

    结果

    Cust   Prod HasSales
    1001    1   1
    1001    2   0
    1001    3   1
    1002    1   1
    1002    2   1
    1002    3   0
    1003    1   0
    1003    2   1
    1003    3   0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      • 2014-08-13
      • 1970-01-01
      • 2017-12-15
      • 2020-06-19
      • 1970-01-01
      • 2011-08-04
      相关资源
      最近更新 更多