【问题标题】:Force query to return all ranges even when there is no data即使没有数据,也强制查询返回所有范围
【发布时间】:2019-03-18 01:26:30
【问题描述】:

我有一个查询,它计算 3 个总和,然后将其分类为后期付款范围。

但有时某些范围没有数据,因此查询返回的行数少于 3 行。

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

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

【问题讨论】:

    标签: sql tsql case


    【解决方案1】:

    您需要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;
    

    【讨论】:

      猜你喜欢
      • 2018-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多