SQL Server 使用SELECT语句填充缺少的行

pbossiut  于 2023-02-03  发布在  其他
关注(0)|答案(2)|浏览(194)

我在编写SELECT SQL语句时遇到了以下问题,不知道是否有人可以帮助我。我有以下带有ProductID和Status字段的表:
| 产品ID|现况|
| - ------|- ------|
| AP56546||
| AP56546|已装运|
| AP56546||
| 模数转换器AD 92402|延迟|
| 模数转换器AD 92402||
| 模数转换器AD 92402||
| 贝伊91455||
| 贝伊91455||
| SL19423||
| SL19423||
| SL19423||
| SL19423|预期|
如果具有相同ID的所有产品中有一个产品具有状态,如何填充这些产品的状态?如果某个产品不存在状态,则它可以保持为空。如何使用SELECT语句执行此操作?预期结果应如下所示(ProductID BE 91455仍为空,因为它所在的任何行都没有状态)
| 产品ID|现况|
| - ------|- ------|
| AP56546|已装运|
| AP56546|已装运|
| AP56546|已装运|
| 模数转换器AD 92402|延迟|
| 模数转换器AD 92402|延迟|
| 模数转换器AD 92402|延迟|
| 贝伊91455||
| 贝伊91455||
| SL19423|预期|
| SL19423|预期|
| SL19423|预期|
| SL19423|预期|
谢谢

s2j5cfk0

s2j5cfk01#

下面使用按ProductId分区的max的代码应该可以满足您的需要:

select ProductId, Max(Status) over(partition by ProductId) Status
from t;
t3psigkw

t3psigkw2#

您可以使用以下查询获得所需的结果:

样表

CREATE TABLE TableData (
    ProductID varchar(10),
    Status varchar(10)
)

示例数据

INSERT INTO TableData (ProductID, Status)
VALUES
    ('AP56546', ''),
    ('AP56546', 'Shipped'),
    ('AP56546', ''),
    ('AD92402', 'Delayed'),
    ('AD92402', ''),
    ('AD92402', ''),
    ('BE91455', ''),
    ('BE91455', ''),
    ('SL19423', ''),
    ('SL19423', ''),
    ('SL19423', ''),
    ('SL19423', 'Expected');

查询

WITH CTE AS (
 SELECT ProductID, Status 
  FROM TableData
  WHERE Isnull(Status,'') <> ''
  GROUP BY ProductID, Status
)
SELECT TableData.ProductID, COALESCE(CTE.Status, '') AS Status
FROM TableData
LEFT JOIN CTE
ON TableData.ProductID = CTE.ProductID;

相关问题