【问题标题】:Querying two tables to filter data using select case使用select case查询两个表来过滤数据
【发布时间】:2016-04-26 05:34:31
【问题描述】:

我有两张桌子 表 1 是这样的

ID  Repeats
-----------
A   1
A   1
A   0
B   2
B   2
C   2
D   1

表 2 如下所示

ID  values
-----------
A   100
B   200
C   100
D   300

使用视图我需要这样的结果

ID  values  Repeats
-------------------
A   100 NA
B   200 2
C   100 2
D   300 1

这意味着,我想要独特的 IDvaluesRepeatsRepeats 值应该在有多个 values 而不是单个 ID 时显示 NA 并且它应该显示 Repeats 值以防repeats 有单个值。

最初我需要显示repeats 的最大值,所以我尝试了以下视图

ALTER VIEW [dbo].[BookingView1]
AS
SELECT bv.*, bd2.Repeats FROM Table1 bv 
JOIN
(
    SELECT distinct bd.id, bd.Repeats FROM table2 bd
    JOIN
    (
      SELECT Id, MAX(Repeats) AS MaxRepeatCount
      FROM table2
      GROUP BY Id
    ) bd1
    ON bd.Id = bd1.Id
    AND bd.Repeats = bd1.MaxRepeatCount
) bd2
ON bv.Id = bd2.Id;

这会返回正确的结果,但是在尝试实现CASE 时,它无法返回唯一的ID 结果。请帮忙!!

【问题讨论】:

    标签: sql sql-server join filtering


    【解决方案1】:

    一种方法使用outer apply

    select t2.*, t1.repeats
    from table2 t2 outer apply
         (select (case when max(repeats) = min(repeats) then max(repeats)
                       else 'NA'
                  end) as repeats
          from table1 t1
          where t1.id = t2.id
         ) t1;
    

    两个音符:

    • 这假定repeats 是一个字符串。如果是数字,则需要将其转换为字符串。
    • repeats 不为空。

    【讨论】:

      【解决方案2】:

      为了完整起见,如果repeatsNULL,我将包含另一种可行的方法。但是,Gordon's answer 的查询计划要简单得多,应该是首选。

      选项 1(适用于 NULLs):

      SELECT 
          t1.ID, t2.[Values], 
          CASE 
              WHEN COUNT(*) > 1 THEN 'NA' 
              ELSE CAST(MAX(Repeats) AS VARCHAR(2)) 
          END Repeats
      FROM (
              SELECT DISTINCT t1.ID, t1.Repeats
              FROM #table1 t1
          ) t1 
          LEFT OUTER JOIN #table2 t2
          ON t1.ID = t2.ID
      GROUP BY t1.ID, t2.[Values]
      

      选项 2(不包含显式子查询,但不适用于 NULLs):

      SELECT DISTINCT 
          t1.ID, 
          t2.[Values], 
          CASE 
              WHEN COUNT(t1.Repeats) OVER (PARTITION BY COUNT(DISTINCT t1.Repeats), t1.ID) > 1 THEN 'NA' 
              ELSE CAST(t1.Repeats AS VARCHAR(2)) 
          END Repeats
      FROM #table1 t1
          LEFT OUTER JOIN #table2 t2
          ON t1.ID = t2.ID
      GROUP BY t1.ID, t2.[Values], t1.Repeats
      

      注意: 如果table2 对相同的ID 有不同的values,这可能不会产生预期的结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-19
        • 2013-10-25
        • 1970-01-01
        • 1970-01-01
        • 2014-07-13
        • 2018-02-05
        • 1970-01-01
        • 2018-12-05
        相关资源
        最近更新 更多