我查询了练习数据库,并想出了一些我想从数据库中看到的内容。
我写了一个查询,给出了我姓氏的第一个首字母、平均工资、总工资和该首字母的数量。
SELECT Left(Achternaam, 1) as '1e_Initiaal_Achternaam',
cast(avg(Salaris) as Int) AS 'Gem. Salaris',
round(cast(sum(Salaris) as Int),0) as 'Salaris',
Count(Left(Achternaam, 1))
FROM Werknemer
GROUP BY Left(Achternaam, 1)
ORDER BY Left(Achternaam, 1);
到目前为止一切都很好,一切都如我所愿。
但是后来我想更进一步,将收入/营业额添加到概述中,给它一个很好的概述,这在现实中完全无用,但这在这种情况下并不重要:
SELECT Left(Achternaam, 1) as '1e_Initiaal_Achternaam',
cast(avg(Salaris) as Int) AS 'Gem. Salaris',
round(cast(sum(Salaris) as Int),0) as 'Salaris',
Count(Left(Achternaam, 1)) as 'Eerste letter achternaam',
sum(orderbedrag) as 'Order Waarde',
sum(orderbedrag) / round(cast(sum(Salaris) as Int),0) as 'omzet per € salaris'
FROM Werknemer
LEFT JOIN Orders
On werknemer.WerknemerID = orders.WerknemerID
GROUP BY Left(Achternaam, 1)
ORDER BY Left(Achternaam, 1);
所以我得到了我的观点,但是由于加入,first_initial(Eerste letter achternaam)不再正确。现在,每个“Acternaam”在数据中的含量要高得多,因为我加入了订单数据。
我怎样才能保留第一个初始计数和加入数据?我以为我必须使用子查询,但我无法做到正确。我尝试按照 w3schools.com 教程中的步骤在子查询中使用 unique 函数。
有很多方法,但这里有一种方法,按原样创建第一个输出,将其视为派生表,然后添加一些子选择。
SELECT A.[1e_Initiaal_Achternaam],
A.[Gem. Salaris],
A.[Salaris],
A.[Count],
(SELECT sum(orderbedrag)
FROM Orders WHERE A.WerknemerID = WerknemerID ) as [Order Waarde],
(SELECT sum(orderbedrag) / round(cast(A.Salaris as Int),0)
FROM Orders WHERE A.WerknemerID = WerknemerID ) as [Salaris2]
来自 (
SELECT WerknemerID,
Left(Achternaam, 1) as '1e_Initiaal_Achternaam',
cast(avg(Salaris) as Int) AS 'Gem. Salaris',
round(cast(sum(Salaris) as Int),0) as 'Salaris',
Count(Left(Achternaam, 1)) as 'Count'
FROM Werknemer
GROUP BY WerknemerID, Left(Achternaam, 1)
ORDER BY Left(Achternaam, 1)
) AS A
创建了一个名为 A 的派生表,连接到它并进行聚合。