Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помощь sql запрс  [new]
thxu2
Member

Откуда:
Сообщений: 3
есть 2 таблицы

baseEm
-------
id | name


emPrem
--------------------------------------------------------------------
id_baseEm (связь с BaseEm) |month (месяц)| prem (Премия)


Нужно для каждого месяца найти сотрудников с наибольшей премией если премия за 1 месяц у нескольких сотрудников одинакова то выбрать всех таких сотрудников.
13 окт 13, 00:06    [14962119]     Ответить | Цитировать Сообщить модератору
 Re: Помощь sql запрс  [new]
Сикуельььь
Guest
Select max(prem),name from emPrem inner join baseEm on id=id_baseEm
group by Imonth,id_BaseEm
13 окт 13, 12:16    [14962608]     Ответить | Цитировать Сообщить модератору
 Re: Помощь sql запрс  [new]
thxu2
Member

Откуда:
Сообщений: 3
Сикуельььь, Чёт нифига не пашет твой запрос как бы как ты будешь брать имена сотрудников если груп бай месяц???
13 окт 13, 13:10    [14962693]     Ответить | Цитировать Сообщить модератору
 Re: Помощь sql запрс  [new]
Bug69
Member

Откуда: Москва, Чертаново
Сообщений: 229
Понятное дело, что кроме месяцев есть еще и годы, но так как таблицы приведены для примера, то и ответ предлагается лишь в виде самого общего представления.
Вариант с табличной переменной привожу на случай, если промежуточные данные надо еще как-нибудь обрабатывать.

/*
=== Неплохо бы было, задавая вопрос, выкладывать скрипт, создающий таблицы, похожий на приведенный ниже ===
*/

USE [tempdb]
GO

IF EXISTS (SELECT * FROM [sys].[tables] AS [a] WHERE [a].[object_id] = OBJECT_ID(N'[emPrem]'))
BEGIN
	DROP TABLE [emPrem]
END
GO

IF EXISTS (SELECT * FROM [sys].[tables] AS [a] WHERE [a].[object_id] = OBJECT_ID(N'[baseEm]'))
BEGIN
	DROP TABLE [baseEm]
END
GO

CREATE TABLE [baseEm]
(
	[id] int IDENTITY(1, 1) NOT NULL
	, [name] varchar(50) NOT NULL
	, CONSTRAINT [PK_baseEm] PRIMARY KEY ([id])
	, CONSTRAINT [UQ_baseEm_name] UNIQUE ([name])
)
GO

CREATE TABLE [emPrem]
(
	[id_baseEm] int NOT NULL
	, [month] int NOT NULL
	, [prem] numeric(6, 2) NOT NULL
	, CONSTRAINT [PK_emPrem] PRIMARY KEY ([month], [id_baseEm])
	, CONSTRAINT [CK_emPrem_month] CHECK ([month] > 0 AND [month] <= 12)
	, CONSTRAINT [CK_emPrem_prem] CHECK ([prem] > 0)
	, CONSTRAINT [FK_emPrem_baseEm] FOREIGN KEY ([id_baseEm]) REFERENCES [baseEm] ([id])
)
GO

/*
=== Еще лучше наполнять таблицы хоть какими-нибудь данными ===
*/
INSERT INTO [baseEm]
SELECT N'Иванов' AS [name] UNION
SELECT N'Петров' AS [name] UNION
SELECT N'Сидоров' AS [name]

INSERT INTO [emPrem]
SELECT 1 AS [id_baseEm], 1 AS [month], 100 AS [prem] UNION
SELECT 1 AS [id_baseEm], 3 AS [month], 100 AS [prem] UNION
SELECT 1 AS [id_baseEm], 4 AS [month], 200 AS [prem] UNION
SELECT 1 AS [id_baseEm], 5 AS [month], 200 AS [prem] UNION
SELECT 1 AS [id_baseEm], 6 AS [month], 100 AS [prem] UNION
SELECT 2 AS [id_baseEm], 1 AS [month], 100 AS [prem] UNION
SELECT 2 AS [id_baseEm], 2 AS [month], 200 AS [prem] UNION
SELECT 2 AS [id_baseEm], 3 AS [month], 100 AS [prem] UNION
SELECT 2 AS [id_baseEm], 5 AS [month], 200 AS [prem] UNION
SELECT 2 AS [id_baseEm], 6 AS [month], 100 AS [prem] UNION
SELECT 3 AS [id_baseEm], 1 AS [month], 200 AS [prem] UNION
SELECT 3 AS [id_baseEm], 2 AS [month], 200 AS [prem] UNION
SELECT 3 AS [id_baseEm], 3 AS [month], 100 AS [prem] UNION
SELECT 3 AS [id_baseEm], 4 AS [month], 100 AS [prem] UNION
SELECT 3 AS [id_baseEm], 5 AS [month], 100 AS [prem]

/*
=== Вариант 1. C использованием табличной переменной ===
*/

DECLARE @maxPrem TABLE
(
	[month] int NOT NULL
	, [prem] numeric(6, 2) NOT NULL
	, PRIMARY KEY ([month])
	, CHECK ([month] > 0 AND [month] <= 12)
	, CHECK ([prem] > 0)
)

INSERT INTO
	@maxPrem
SELECT
	[month]
	, MAX([prem]) AS [prem]
FROM
	[emPrem]
GROUP BY
	[month]

SELECT
	[c].[id]
	, [c].[name]
	, [b].[month]
	, [b].[prem]
FROM
	@maxPrem AS [a]
	LEFT OUTER JOIN [emPrem] AS [b] ON [b].[month] = [a].[month] AND [b].[prem] = [a].[prem]
	LEFT OUTER JOIN [baseEm] AS [c] ON [c].[id] = [b].[id_baseEm]
GO

/*
=== Вариант 1. Без использования табличной переменной ===
*/

SELECT
	[c].[id]
	, [c].[name]
	, [b].[month]
	, [b].[prem]
FROM
	(SELECT [month], MAX([prem]) AS [prem] FROM [emPrem] GROUP BY [month]) AS [a]
	LEFT OUTER JOIN [emPrem] AS [b] ON [b].[month] = [a].[month] AND [b].[prem] = [a].[prem]
	LEFT OUTER JOIN [baseEm] AS [c] ON [c].[id] = [b].[id_baseEm]
GO
13 окт 13, 14:31    [14962805]     Ответить | Цитировать Сообщить модератору
 Re: Помощь sql запрс  [new]
thxu2
Member

Откуда:
Сообщений: 3
Bug69,

Спасибо буду разбираться.
13 окт 13, 15:28    [14962881]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить