【问题标题】:How to write this SQL Server query: Add values in unique rows?如何编写此 SQL Server 查询:在唯一行中添加值?
【发布时间】:2018-03-22 10:52:05
【问题描述】:

我有一个如下查询。表之间的关系是:

每辆卡车可能有多个司机。表列表将表 Truck 中的每一行与表 Driver 中的行连接起来。现在我想获取特定条件下独特卡车的数量,以及该条件下独特卡车的总大小。

这是我所拥有的:

SELECT t.Year AS [Year]
        , t.Month AS [Month]
        , t.Day AS [Day]

        -- Count will not count NULL
        , COUNT( DISTINCT (CASE WHEN (t.Sent = 1 AND r.Internal=1) THEN L.TruckId
                ELSE NULL
            END) ) AS [Count]

        , SUM(CASE WHEN (t.Sent = 1 AND r.Internal = 1) THEN t.Size
            END) AS [Size]

FROM Truck t
INNER JOIN List L ON t.Id = L.TruckId
        INNER JOIN Driver r ON L.DriverId = r.Id
GROUP BY t.Year, t.Month, t.Day
  • COUNT 正确,但 SUM 不正确。

我的问题是如何得到这个 SUM? 而且我不想写 2 个查询并加入它们。

谢谢

【问题讨论】:

  • 请提供样本数据和预期结果。
  • 你说“总和不是”是什么意思?,你期望什么值?首先我建议你使用这样的“else”子句:SUM(CASE WHEN (t.Sent = 1 AND r.Internal = 1) THEN t.Size ELSE 0 END) AS [Size]

标签: sql-server


【解决方案1】:

您可以尝试如下查询:

; with cte as (
SELECT 
    DISTINCT
      t.Year AS [Year]
    , t.Month AS [Month]
    , t.Day AS [Day]
    , L.TruckId,
    , t.Size
FROM Truck t
INNER JOIN List L ON t.Id = L.TruckId
INNER JOIN Driver r ON L.DriverId = r.Id
WHERE t.Sent = 1 AND r.Internal=1
)
select 
      Year
    , Month
    , Day
    , count(TruckId) AS [Count]
    , sum(Size) AS [Size]
from cte 
group by Year, Month, Day

【讨论】:

  • 这在功能上不等同!问题中的查询将返回卡车,无论:t.Sent = 1 AND r.Internal=1
猜你喜欢
  • 2013-02-01
  • 1970-01-01
  • 2015-08-14
  • 1970-01-01
  • 2013-01-17
  • 1970-01-01
  • 2017-12-12
  • 1970-01-01
  • 2012-02-29
相关资源
最近更新 更多