SQL Return 每行即使是 Null 值
SQL Return every row even if Null values
我想 return 合同 table 中的所有行,但是第二个 WHERE 子句只生成不为空的行。 (换句话说,在下面的代码中 'CAD' 限制意味着大约一半的可能行没有以加元交易的价值,因此没有 returned -- 而我想要所有可能的行 returned 在适用的地方显示 NULL 值)。
我认为这是一个 Left Self Join 但我在语法上苦苦挣扎(and/or 我是否需要做一个内部 Select),
SELECT MeasurableID,
EntityID,
MIN (ContractPrice) AS LowPrice,
MAX (ContractPrice) AS HighPrice
FROM dbo.Contracts
WHERE dbo.Contracts.MeasurableID = 2018
AND Contracts.CurrencyCode IN ( 'CAD' )
GROUP BY
dbo.Contracts.MeasurableID,
dbo.Contracts.EntityID
使用条件聚合:
SELECT
MeasurableID,
EntityID,
MIN (CASE WHEN CurrencyCode = 'CAD' THEN ContractPrice END) AS LowPrice,
MAX (CASE WHEN CurrencyCode = 'CAD' THEN ContractPrice END) AS HighPrice
FROM dbo.Contracts
WHERE MeasurableID = 2018
GROUP BY MeasurableID, EntityID
ORDER BY MeasurableID, EntityID;
对于未来的读者,Thorsten 回答了已发布的问题,但根据他的回答下方的评论,该问题无法付诸实践。因此,我不得不这样编码:
SELECT
t1.MeasurableID,
t1.EntityID,
t2.HIGH,
t2.LOW
FROM
(
SELECT
MeasurableID,
EntityID
FROM
Contracts
WHERE
MeasurableID IN (2017, 2018)
GROUP BY
MeasurableID,
EntityID
) t1
LEFT JOIN (
SELECT
MeasurableID,
EntityID,
MAX (ContractPrice) AS HIGH,
MIN (ContractPrice) AS LOW
FROM
Contracts
WHERE
MeasurableID IN (2017, 2018)
AND CurrencyCode IN ('CAD', 'BTC')
GROUP BY
MeasurableID,
EntityID
) t2 ON t1.MeasurableID = t2.MeasurableID
AND t1.EntityID = t2.EntityID
ORDER BY
t1.MeasurableID,
t1.EntityID;
使用分组依据..
select * 来自 Adjusters group by CompanyID;
我想 return 合同 table 中的所有行,但是第二个 WHERE 子句只生成不为空的行。 (换句话说,在下面的代码中 'CAD' 限制意味着大约一半的可能行没有以加元交易的价值,因此没有 returned -- 而我想要所有可能的行 returned 在适用的地方显示 NULL 值)。
我认为这是一个 Left Self Join 但我在语法上苦苦挣扎(and/or 我是否需要做一个内部 Select),
SELECT MeasurableID,
EntityID,
MIN (ContractPrice) AS LowPrice,
MAX (ContractPrice) AS HighPrice
FROM dbo.Contracts
WHERE dbo.Contracts.MeasurableID = 2018
AND Contracts.CurrencyCode IN ( 'CAD' )
GROUP BY
dbo.Contracts.MeasurableID,
dbo.Contracts.EntityID
使用条件聚合:
SELECT
MeasurableID,
EntityID,
MIN (CASE WHEN CurrencyCode = 'CAD' THEN ContractPrice END) AS LowPrice,
MAX (CASE WHEN CurrencyCode = 'CAD' THEN ContractPrice END) AS HighPrice
FROM dbo.Contracts
WHERE MeasurableID = 2018
GROUP BY MeasurableID, EntityID
ORDER BY MeasurableID, EntityID;
对于未来的读者,Thorsten 回答了已发布的问题,但根据他的回答下方的评论,该问题无法付诸实践。因此,我不得不这样编码:
SELECT
t1.MeasurableID,
t1.EntityID,
t2.HIGH,
t2.LOW
FROM
(
SELECT
MeasurableID,
EntityID
FROM
Contracts
WHERE
MeasurableID IN (2017, 2018)
GROUP BY
MeasurableID,
EntityID
) t1
LEFT JOIN (
SELECT
MeasurableID,
EntityID,
MAX (ContractPrice) AS HIGH,
MIN (ContractPrice) AS LOW
FROM
Contracts
WHERE
MeasurableID IN (2017, 2018)
AND CurrencyCode IN ('CAD', 'BTC')
GROUP BY
MeasurableID,
EntityID
) t2 ON t1.MeasurableID = t2.MeasurableID
AND t1.EntityID = t2.EntityID
ORDER BY
t1.MeasurableID,
t1.EntityID;
使用分组依据..
select * 来自 Adjusters group by CompanyID;