【问题标题】:How to dynamically add row(s) in SQL query result如何在 SQL 查询结果中动态添加行
【发布时间】:2018-03-10 12:06:44
【问题描述】:

这个查询

SELECT T.TestTypeId, F.FlockCode, AMT, CV, S.SampleDate 
FROM [dbo].[Tests] AS T 
JOIN [Samples] AS S ON T.SampleId = S.Id 
JOIN [TestTypes] AS TT ON T.TestTypeId = TT.Id 
JOIN [Flocks] AS F ON T.FlockId = F.Id 
WHERE T.TestTypeId = 7 AND T.IsDeleted = 0 
AND S.SampleDate BETWEEN '2017-12-17' AND '2018-01-08' 
AND T.FlockId IN (7,13)
ORDER BY S.SampleDate, F.FlockCode

返回以下结果

TestTypeId  FlockCode   AMT     CV      SampleDate
7           R1.33       8.93    9.28    2017-12-17
7           R1.33       9.05    10.76   2018-01-01
7           R1.37       8.95    8.99    2018-01-01

这对于现有数据是准确的,其中S.SampleDate 2017-12-17 只有一行FlockCode R1.33。

现在我需要在此结果中为 00AMTCV 值的数据 2017-12-17 上的 FlockCode R1.37 添加另一行。

所以预期的结果是

TestTypeId  FlockCode   AMT     CV      SampleDate
7           R1.33       8.93    9.28    2017-12-17
7           R1.37       0       0       2017-12-17
7           R1.33       9.05    10.76   2018-01-01
7           R1.37       8.95    8.99    2018-01-01

SQLLINQC# 中的任何解决方案都会非常有帮助。提前致谢。

【问题讨论】:

    标签: c# sql sql-server linq


    【解决方案1】:

    基本结构是使用cross joinleft join 执行此操作。您的查询有点复杂,所以我建议:

    with t as (
          SELECT T.TestTypeId, F.FlockCode, AMT, CV, S.SampleDate 
          FROM [dbo].[Tests] T JOIN
               [Samples] S
               ON T.SampleId = S.Id JOIN
               [TestTypes] TT
               ON T.TestTypeId = TT.Id  JOIN
               [Flocks] F
               ON T.FlockId = F.Id 
          WHERE T.TestTypeId = 7 AND T.IsDeleted = 0 AND
                S.SampleDate BETWEEN '2017-12-17' AND '2018-01-08' AND
                T.FlockId IN (7, 13)
         )
    SELECT f.TestTypeId, f.FlockCode, COALESCE(t.AMT, 0) as AMT,
           COALESCE(t.CV, 0) as CV, d.SampleDate
    FROM (SELECT DISTINCT TestTypeId, FlockCode FROM t) f CROSS JOIN
         (SELECT DISTINCT SampleDate FROM t) d LEFT JOIN
         t
         ON f.FlockCode = t.FlockCode AND f.TestTypeId = t.TestTypeId,
            d.SampleDate = t.SampleDate
    ORDER BY d.SampleDate, f.FlockCode;
    

    【讨论】:

    • 啊,这就是我要找的答案
    【解决方案2】:

    UNION吧!

    SELECT T.TestTypeId, F.FlockCode, AMT, CV, S.SampleDate 
    FROM [dbo].[Tests] AS T 
    JOIN [Samples] AS S ON T.SampleId = S.Id 
    JOIN [TestTypes] AS TT ON T.TestTypeId = TT.Id 
    JOIN [Flocks] AS F ON T.FlockId = F.Id 
    WHERE T.TestTypeId = 7 AND T.IsDeleted = 0 
    AND S.SampleDate BETWEEN '2017-12-17' AND '2018-01-08' 
    AND T.FlockId IN (7,13)
    UNION
    SELECT 7 AS TestTypeId, 'R1.37' as FlockCode, 0 as AMT, 0 as CV, '2017-12-17' as SampleDate
    ORDER BY SampleDate, FlockCode
    

    【讨论】:

    • 感谢您的回答,这符合要求,但这里7R1.37 将动态更改。
    【解决方案3】:

    SQL中你可以使用UNION操作符

    SELECT T.TestTypeId, F.FlockCode, AMT, CV, S.SampleDate 
    FROM [dbo].[Tests] AS T 
    JOIN [Samples] AS S ON T.SampleId = S.Id 
    JOIN [TestTypes] AS TT ON T.TestTypeId = TT.Id 
    JOIN [Flocks] AS F ON T.FlockId = F.Id 
    WHERE T.TestTypeId = 7 AND T.IsDeleted = 0 
    AND S.SampleDate BETWEEN '2017-12-17' AND '2018-01-08' 
    AND T.FlockId IN (7,13)
    UNION 
    SELECT 7 AS TestTypeId, 'R1.37' AS FlockCode, 0 AS AMT, 0 AS CV, '2017-12-17' AS SampleDate
    ORDER BY SampleDate, FlockCode
    

    【讨论】:

    • 感谢您的回答,这符合要求,但这里7R1.37 将动态更改。
    猜你喜欢
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 2013-12-12
    • 1970-01-01
    相关资源
    最近更新 更多