【问题标题】:SQL Select Query to retrieve data from 2 Tables -show 0 not i table1 or table 2SQL 选择查询以从 2 个表中检索数据 - 显示 0 而不是我表 1 或表 2
【发布时间】:2018-09-16 16:17:43
【问题描述】:

我有 2 个如下表

TABLE_1

Date         Code   Time   Weight
01-09-2018      1   AM        100
01-09-2018      1   AM        120
01-09-2018      2   AM         80
01-09-2018      4   AM        135
02-09-2018      1   AM         50
02-09-2018      2   AM        110
02-09-2018      3   AM        115


TABLE_2

Date         Code   Time    Weight
01-09-2018      1   PM        110
01-09-2018      2   PM        115
01-09-2018      3   PM        125
01-09-2018      4   PM        100
02-09-2018      1   PM        130
02-09-2018      3   PM         50
02-09-2018      1   PM         75

想要的结果

Date         Code    AM    PM
01-09-2018      1   220   110
01-09-2018      2    80   115
01-09-2018      3     0   125
01-09-2018      4   135   100
02-09-2018      1    50   205
02-09-2018      2   110     0
02-09-2018      3   115    50

我需要此输出的 MS-SQL 选择查询。

【问题讨论】:

  • 请描述您用来创建所需结果的逻辑。然后向我们展示你已经尝试过。见How to Ask

标签: sql sql-server date group-by


【解决方案1】:

使用左连接和条件聚合

select t1.date, t1.code, 
       sum(case when t1.Time='AM' then t1.weight else 0 end ) as AM,
       sum(case when t2.Time='PM' then t2.weight else 0 end ) as PM
  from table1 t1 lef join table2 t2 on t1.code =t2.code and t1.date=t2.date
 group by t1.date, t1.code

或者你也可以使用 cte 来写

with t1 as

(select date,code,time,sum(weight) as w from table1
group by date,code
),
t2 as
(
select date,code,time,sum(weight) as w from table2
group by date,code
) select t1.date,t1.code, max(case when t1.time='AM' then t1.w end)  as AM,
         max(case when t2.time='PM' then t1.w end) as PM
          from t1 left join t2 on t1.code=t2.code and t1.date=t2.date
           group by t1.date,t1.code

https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=e7e0bf11006a2b04602ca9f0a4071ed0

【讨论】:

  • 不明确的列名“日期”。不明确的列名“代码”。
  • Zaynul 我认为这应该通过将两个表左连接到日历表/任意行生成日期来解决..但也可以完全外部加入它..?
  • @SatheshKumar dbfiddle.uk/… 检查此结果是否正确
  • @SatheshKumar dbfiddle.uk/… 看看这个
【解决方案2】:

先分组可能更容易理解:

select 
  Coalesce(t1.[date], t2.[date]) as [date],
  Coalesce(t1.code, t2.code) as code,
  Coalesce(Sum_am, 0) as [am],
  Coalesce(Sum_pm, 0) as [pm]
From
  (Select [date], code, sum(weight) as sum_am from table1 group by [date], code) t1
  Full outer join 
  (Select [date], code, sum(weight) as sum_pm from table2 group by [date], code) t2
  on t1.code =t2.code and t1.[date]=t2.[date]

【讨论】:

  • 这个很完美,很容易理解。谢谢你。凯厄斯贾德。干得好。
【解决方案3】:

这是数据透视表的经典示例。现代 RDBMS 在一个语句中为您完成所有工作(见下文)。

首先,没有理由根据 AM/PM 的区别将数据分成两个表。这不是一个好主意。即使这是具有大量数据且需要分区表的大型应用程序的简化版本,您也应该进行设置,以便可以针对一个主表执行查询。

那么,让我们将所有数据放入表 1。

insert into t1 values('2018-09-01',1,'AM',100),
('2018-09-01',1,'AM',120),
('2018-09-01',2,'AM',80),
('2018-09-02',1,'AM',50),
('2018-09-02',2,'AM',110),
('2018-09-01',1,'PM',110),
('2018-09-01',2,'PM',115);

现在让我们使用google 来获取PIVOT 命令语法。 (这肯定会因其他供应商而异;我认为它不是 SQL 标准的一部分,至少与通常实施的一样。)

快!

select * FROM t1 
PIVOT (SUM(weight) FOR [time] in ([AM], [PM])) AS tz;

日期 1 代码 上午 下午 2018 年 1 月 9 日 00:00:00 1 220 110 02/09/2018 00:00:00 1 50
2018 年 1 月 9 日 00:00:00 2 80 115 2018 年 2 月 9 日 00:00:00 2 110

(如果您确实需要将 PM 中的空白替换为零,您可以将其用作子查询和 COALESCE。此外,如果您确实需要两个表,请在使用 @ 之前使用子查询将它们一起 UNION 987654327@.)

【讨论】:

    猜你喜欢
    • 2014-03-12
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 2021-02-18
    • 2017-03-06
    相关资源
    最近更新 更多