Sql 从2个表中选择2个不同的值
您好,我想选择,与状态为“赢得”的投标id相关联的每个拍卖id,以及状态为“过期”的每个拍卖id,作为我的声明中的两个独立列,请有人帮忙,第一列将是“赢得”,第二列将过期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
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我添加了另一个版本。我想这可能就是你想要的。