Sql 从2个表中选择2个不同的值

Sql 从2个表中选择2个不同的值,sql,sql-server,Sql,Sql Server,您好,我想选择,与状态为“赢得”的投标id相关联的每个拍卖id,以及状态为“过期”的每个拍卖id,作为我的声明中的两个独立列,请有人帮忙,第一列将是“赢得”,第二列将过期 SELECT Auction.AuctionID, DATENAME(mm, BID.Date) AS Month FROM BID INNER JOIN Auction ON BID.AuctionID = Auction.AuctionID WHERE

您好,我想选择,与状态为“赢得”的投标id相关联的每个拍卖id,以及状态为“过期”的每个拍卖id,作为我的声明中的两个独立列,请有人帮忙,第一列将是“赢得”,第二列将过期

SELECT 
      Auction.AuctionID, 
      DATENAME(mm, BID.Date) AS Month
FROM 
      BID INNER JOIN Auction ON BID.AuctionID = Auction.AuctionID
WHERE        
      BID.Status = 'Won'
ORDER BY Month
预期结果:

AuctionID   Month                          Won  Expired
----------- ------------------------------ ---- -------
1           January                         32    22
2           March                           10    22
3           April                            0     2

拍卖不能同时赢得和过期,因此您不需要拥有例如:AuctionId 1:won:120214、expired 050214

让我们想象一下这是可能的:

with p as (
   SELECT Auction.AuctionID, DATENAME(mm, BID.Date) AS Month
   FROM BID 
   INNER JOIN Auction ON BID.AuctionID = Auction.AuctionID)

select AuctionId, max(Won), Max(Expired)
from
(
   select AuctionId, Month as Won, null as Expired from p
   WHERE (BID.Status = 'Won')
   union
   select AuctionId, null, Month from p 
   WHERE (BID.Status = 'Expired')
) z
ORDER BY Won, Expired

如果您想要的结果是这样的:

AuctionID   Month                          Won  Expired
----------- ------------------------------ ---- -------
1           January                        Won  NULL
2           January                        Won  NULL
3           January                        NULL Expired
AuctionID   Month                          Status
----------- ------------------------------ --------------------
1           January                        Won
2           February                       Won
3           January                        Expired
然后您可以使用以下查询:

SELECT        
    A.AuctionID, 
    DATENAME(mm, B.Date) AS Month, 
    CASE Status WHEN 'Won' THEN 'Won' ELSE NULL END AS Won, 
    CASE Status WHEN 'Expired' THEN 'Expired' ELSE NULL END AS Expired 
FROM BID b 
INNER JOIN Auction a ON B.AuctionID = A.AuctionID
ORDER BY Month, AuctionID
SELECT 
    DATENAME(mm, B.Date) AS Month, 
    SUM(CASE WHEN Status = 'Won' THEN 1 ELSE 0 END) AS Won,
    SUM(CASE WHEN Status = 'Expired' THEN 1 ELSE 0 END) AS Expired
FROM BID b 
INNER JOIN Auction a ON B.AuctionID = A.AuctionID
GROUP BY DATENAME(mm, B.Date), B.Date
ORDER BY b.Date 
但是如果你想要的结果是这样的:

AuctionID   Month                          Won  Expired
----------- ------------------------------ ---- -------
1           January                        Won  NULL
2           January                        Won  NULL
3           January                        NULL Expired
AuctionID   Month                          Status
----------- ------------------------------ --------------------
1           January                        Won
2           February                       Won
3           January                        Expired
然后此查询将执行以下操作:

SELECT        
    A.AuctionID, 
    DATENAME(mm, B.Date) AS Month, 
    Status
FROM BID b 
INNER JOIN Auction a ON B.AuctionID = A.AuctionID
ORDER BY Status Desc, Month DESC, AuctionID
第三次尝试。要获得此信息:

Month                          Won         Expired
------------------------------ ----------- -----------
January                        1           1
February                       1           0
使用此查询:

SELECT        
    A.AuctionID, 
    DATENAME(mm, B.Date) AS Month, 
    CASE Status WHEN 'Won' THEN 'Won' ELSE NULL END AS Won, 
    CASE Status WHEN 'Expired' THEN 'Expired' ELSE NULL END AS Expired 
FROM BID b 
INNER JOIN Auction a ON B.AuctionID = A.AuctionID
ORDER BY Month, AuctionID
SELECT 
    DATENAME(mm, B.Date) AS Month, 
    SUM(CASE WHEN Status = 'Won' THEN 1 ELSE 0 END) AS Won,
    SUM(CASE WHEN Status = 'Expired' THEN 1 ELSE 0 END) AS Expired
FROM BID b 
INNER JOIN Auction a ON B.AuctionID = A.AuctionID
GROUP BY DATENAME(mm, B.Date), B.Date
ORDER BY b.Date 
试试这个

SELECT 
  Auction.AuctionID, 
  DATENAME(mm, BID.Date) AS Month,
  CASE status 
    WHEN Won THEN Status As Won
    WHEN Expired THEN Status As Expired
  END
FROM 
  BID INNER JOIN Auction ON BID.AuctionID = Auction.AuctionID
ORDER BY Month

你能试试这样的东西吗?它不完全是一个概述

***

    SELECT 
          Auction.AuctionID, 
          DATENAME(mm, b1.Date) AS Month,
          COUNT(*) AS `Won`,
          (SELECT count(*) from BID b2 WHERE  DATENAME(mm, b1.Date) = DATENAME(mm, b2.Date))-COUNT(*) AS `EXPIRED` 
    FROM 
          BID b1
          INNER JOIN Auction ON BID.AuctionID = Auction.AuctionID       
    WHERE        
          BID.Status = 'Won' 
    GROUP BY Month

***

您希望在这些列中显示哪些数据?一次拍卖可以同时中标和过期吗?一次拍卖不能中标或过期,不能同时中标和过期。您需要两个列做什么?一个总是空的。您能否(在您的问题中)发布一个示例,说明几次拍卖(包括自有拍卖和过期拍卖)的预期输出,以及列标题和数据?我要显示的是所有拍卖ID,其中有一个关联的BidID,其状态为“赢得”,最后是所有拍卖ID,其自身状态为“过期”,我不是落选者,但在其当前格式中,这是无效的TSQL。@David如果我写错了什么,那么我就应该被否决。我要显示的是所有拍卖ID,其中有一个关联的BidID,其状态为“赢得”,最后是他自己的状态为“过期”的所有拍卖ID。这些示例看起来不错,所以,让我很好地解释一下我在做什么,我在计算竞价。Status='won'和拍卖的另一个计数。Status='Expired',我将在中显示这个结果graph@user3287068我添加了另一个版本。我想这可能就是你想要的。