SQL查询到完整列,而不在Group By中定义它,并优化内部联接
一个包含多列,两个测试表有一列SQL查询到完整列,而不在Group By中定义它,并优化内部联接,sql,sql-server,Sql,Sql Server,一个包含多列,两个测试表有一列 Table: Client Name age Benefit Id code value Tom 33 AA 0A 1 12 Tom 33 AB 0C 1 13 Tom 33 AA 0C 5 11 Sam 31 CC 0B 3 10 Rik 28 EE 0D 5 9 Table2: Sell Code1 1 4 Table3: t
Table: Client
Name age Benefit Id code value
Tom 33 AA 0A 1 12
Tom 33 AB 0C 1 13
Tom 33 AA 0C 5 11
Sam 31 CC 0B 3 10
Rik 28 EE 0D 5 9
Table2: Sell
Code1
1
4
Table3: tip
Code2
5
6
我希望输出为姓名、年龄、福利、Id和代码,这些代码显示在表“sell”和“tip”中
我写的代码是
------Break code-----------
Create table #temp1 as
select c.* from Client c inner join Sell s on c.code1 = s.code
where Benifit= AA
Create table #temp2 as
select c.* from Client c inner join Sell s on c.code2 = s.code
where Benifit= AA
Create table #combine as
select ss.* ,
,case when ss.value > 5 then ss.value- 5 Else 0 approved
from #temp1 ss inner join #temp2 ff
On ss.Name= ff.Name
AND ss.Age= ff.Age
where Benifit= 'AA'
Group by ss.Name Age
------------------------------------------------
----Since 3 table are created with repeated logic, I have put Above code is put into one code, even thought it is not optimized ----------------
select ss.Name, ss.age
,case when ss.value > 5 then ss.value- 5 Else 0 approved
from
(select * from Client c inner join Sell s on c.code1 = s.code
where Benifit= AA) ss
inner join
(select * from Client cc inner join Tip t on cc.code2 = t.code
where Benifit= AA) ff
On ss.Name= ff.Name
AND ss.Age= ff.Age
Group by Name Age
所以,我有两个问题:
- 客户与销售的内部连接
- 客户端和Tip之间的内部连接
注意:我想要名称、年龄,其中Benifit=AA的“Sell”和“Tip”中都有代码,尽管输出将来自“Sell”。我想您需要这样的查询-
SELECT C.Name, C.Age, C.Benefit, C.Id, C.Code, (C.Value - 5) Approved
FROM Client C
INNER JOIN Sell S ON C.Code = S.Code1
INNER JOIN Tip T ON S.Code1 = T.Code2
WHERE C.Benefit = 'AA'
如何确定结果集中的福利和id?我在
sell
和tip
表中都没有看到code=1
。它只在sell
中。另外,Approved
来自何处?Approved是一个新的列,从值列中减去5。是的,我的错误代码1和代码2。实际名称是codeBenefit,Id是我在结果中需要的,因此我将其作为参考。事实上,给出的输出是我的要求,但我不知道如何获得适当的答复,但它不会工作。因为,首先我有一个内部连接客户机和Sell,以获得客户机和Sell表中存在代码的所有名称。然后我必须再次使用Tip内部连接客户机,以获得客户机和Tip中的代码。最后,我们必须根据名称、年龄(因为这两者都存在于两个innerjoin的输出中)以及Where condit Benefit=“AA'我的答案仅基于您在问题中提供的客户、销售、小费三个表格中的样本值/结构。根据您在这里的评论,我想说您在问题中提供的带有示例值的表结构是不正确的。请更新问题并提供适当的表格结构。我已经做了必要的更改。您的问题仍然有以下表格信息-客户(姓名、年龄、福利、Id、代码、价值)。销售(代码1),小费(代码2)。这是正确的信息吗?如果不正确,请更新您的问题。是的,它是正确的。让我更详细地解释一下代码
a. (select * from Client c inner join Sell s on c.code = s.code1
where Benifit= AA) ss
b. (select * from Client cc inner join Tip t on cc.code2 = t.code
where Benifit= AA) ff
SELECT C.Name, C.Age, C.Benefit, C.Id, C.Code, (C.Value - 5) Approved
FROM Client C
INNER JOIN Sell S ON C.Code = S.Code1
INNER JOIN Tip T ON S.Code1 = T.Code2
WHERE C.Benefit = 'AA'