【问题标题】:SQL Count columns from other columnsSQL Count 来自其他列的列
【发布时间】:2020-01-24 13:56:01
【问题描述】:

我在使用 LEFT JOIN 超过 2 个表后生成了这个视图(简化示例)。

表格:

T1: Id, ...other columns not used
+----+-----+
| Id | ... |
+----+-----+
| 1  | ... |
| 2  | ... |
+----+-----+
T2: Id, NewId (Foreign Key from T1), Status, ...other columns not used
+-----+-------+--------+-----+
| Id  | NewId | Status | ... |
+-----+-------+--------+-----+
| 1   | 1     | 1      | ... |
| 2   | 1     | 2      | ... |
| 3   | 1     | 2      | ... |
| 4   | 1     | 3      | ... |
| 5   | 1     | 1      | ... |
| 6   | 1     | 1      | ... |
| 7   | 2     | 0      | ... |
| 8   | 2     | 2      | ... |
| 9   | 2     | 1      | ... |
| 10  | 2     | 2      | ... |
+-----+-------+--------+-----+

当前视图:

SELECT
  T1.Id,
  T2.Status
FROM T1
LEFT JOIN T2 ON T1.Id = T2.NewId;

查看:(我到了这里)

+----+--------+
| Id | Status |
+----+--------+
| 1  | 1      |
| 1  | 2      |
| 1  | 2      |
| 1  | 3      |
| 1  | 1      |
| 1  | 1      |
| 2  | 0      |
| 2  | 2      |
| 2  | 1      |
| 2  | 2      |
+----+--------+

所需的视图需要为每个状态值(正好是 0、1、2 或 3)有单独的列。 0 和 1 保留在同一列中。

必需的视图:(但我需要这个)

+----+------------+----------+----------+
| Id | Status 0/1 | Status 2 | Status 3 |
+----+------------+----------+----------+
| 1  | 1          | 1        | 1        |
| 2  | 2          | 2        | 2        |
+----+------------+----------+----------+

我觉得我错过了一些基本的东西。 如何获得此视图?

我认为我们不需要 Rank() 的东西,而且它是对 4 个规范化表的大查询(在实践中),这就是我需要最佳解决方案的原因。 子查询与内联 SELECT 查询一起使用,但它们也需要 JOINs。生产要求有 10 列,用于计数超过 2 个单独的列。

【问题讨论】:

  • SUM(CASE WHEN Status IN (0, 1) THEN 1 ELSE 0 END) AS [Status 0/1], ...(不过,您的输入和结果目前与您的描述不符,因此尚不清楚您真正想要的是什么。)
  • 我在 prod 中有 4 个规范化的表,我需要加入这些表来创建第一个视图,但是,我希望在同一个查询中获得所需的视图。

标签: sql sql-server tsql group-by pivot


【解决方案1】:

使用条件聚合:

select
    id,
    sum(case when status in (0, 1) then 1 else 0 end) status_0_1,
    sum(case when status = 2 then 1 else 0 end) status_2
    sum(case when status = 3 then 1 else 0 end) status_3
from mytable
group by id

在您的原始查询中,应如下所示:

select
    t1.id,
    sum(case when t2.status in (0, 1) then 1 else 0 end) status_0_1,
    sum(case when t2.status = 2 then 1 else 0 end) status_2
    sum(case when t2.status = 3 then 1 else 0 end) status_3
from t1
left join t2 on t1.id = t2.newid
group by t1.id

【讨论】:

  • 我已使用原始表架构更新了问题。您是否建议我应该嵌套完整的 JOIN 查询,然后使用 SUM/CASE 语法?是否可以在同一个查询中这样做?
  • @AjitZero:我更新了我的答案,以展示如何使用您的原始查询执行此操作。你不需要包装它。
【解决方案2】:

使用聚合:

select id,
       sum(case when status in (0, 1) then 1 else 0 end) as status_01,
       sum(case when status = 2 then 1 else 0 end) as status_2,
       sum(case when status = 3 then 1 else 0 end) as status_3
from t
group by id;

您应该能够将其直接构建到您的left join

from a left join
     b
     on . . . 

可以是from 子句。或者将您当前的查询用作子查询或 CTE。

【讨论】:

  • 我已使用原始表架构更新了问题。同时我会尝试 FROM 语法
猜你喜欢
  • 1970-01-01
  • 2019-05-29
  • 1970-01-01
  • 2021-02-09
  • 1970-01-01
  • 2020-04-06
  • 1970-01-01
  • 2011-09-02
  • 1970-01-01
相关资源
最近更新 更多