代码之家  ›  专栏  ›  技术社区  ›  Megrez7

强制查询返回所有范围,即使没有数据

  •  0
  • Megrez7  · 技术社区  · 7 年前

    如何强制查询始终返回3行,即使没有特定数据 DaysLate 射程?在这种情况下 Suma Docs 应包含零。

    SELECT MIN(b.Range) Nazwa, SUM(b.Remaining) Suma, COUNT(*) Docs
    FROM (
    SELECT
    CASE
        WHEN a.DaysLate BETWEEN 1 AND 14 THEN 'Late 1 to 14 days'
        WHEN a.DaysLate BETWEEN 15 AND 30 THEN 'Late 15 to 30 day'
        ELSE 'Late over 30 days'
    END AS Range,
    CASE
        WHEN a.DaysLate BETWEEN 1 AND 14 THEN 1
        WHEN a.DaysLate BETWEEN 15 AND 30 THEN 2
        ELSE 3
    END AS Order,
    Remaining, DaysLate
    FROM (
        SELECT DATEDIFF(dd, PaymentDate, GETDATE()) DaysLate, (WN - MA) Remaining
        FROM dbo.MyData
        WHERE DATEDIFF(dd, PaymentDate, GETDATE()) > 0 AND KOD_ID = @KOD_ID
        ) a
    ) b
    GROUP BY b.Order
    ORDER BY b.Order ASC
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Gordon Linoff    7 年前

    你需要一个 LEFT JOIN ,但也可以使用 APPLY

    SELECT ranges.range, SUM(v.Remaining) as Suma,
           COUNT(*) as Docs
    FROM (VALUES ('Late 1 to 14 days', 1),
                 ('Late 15 to 30 day', 2),
                 ('Late over 30 days', 3)
         ) ranges(range, ord) LEFT JOIN
         (dbo.MyData d CROSS APPLY
          (VALUES (DATEDIFF(day, d.PaymentDate, GETDATE()),
                   WN - MA
                  )
          ) v(DaysLate, Remaining) CROSS APPLY
          (VALUES (CASE WHEN v.DaysLate BETWEEN 1 AND 14
                        THEN 'Late 1 to 14 days'
                        WHEN v.DaysLate BETWEEN 15 AND 30
                        THEN 'Late 15 to 30 day'
                        ELSE 'Late over 30 days'
                   END)
          ) v1(range)
         )
         ON v1.range = ranges.range                  
    WHERE v.DaysLate > 0 AND
          KOD_ID = @KOD_ID
    GROUP BY v.range, v.ord
    ORDER BY v.ord;