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

Откуда:
Сообщений: 111
Скажите пожалуйста как иначе можно решить данную задачу, более рационально?

Есть таблица, в которой хранятся следующие данные: номер счета, имя , фамилия клиента, страна, сумма перечисленная на карточку.
Мое решение

declare  @SomeTable TABLE(
member_no	int not null,
cont		int not null,
lastname	char(50) not null,
firstname	char(50) not null,
adress		char(50) not null,
summa		decimal(10,2) not null
) 

insert into @SomeTable(member_no, cont, lastname, firstname, adress, summa)
values	(1, 456327472, 'Ivanov', 'Ivan', 'Moscow', 5000),
	(2, 456327472, 'Ivanov', 'Ivan', 'Moscow', 4000),
	(3, 589845668, 'Ivanov', 'Ivan', 'Moscow', 10000),
	(4, 996327472, 'Petrov', 'Vasea', 'Rostov', 20000),
	(5, 996327472, 'Petrov', 'Vasea', 'Rostov', 80000);		

with AA as(
select   ST.cont AS Cont 
	,sum(ST.summa) As Amount
from @SomeTable ST
group by ST.cont
)

select   distinct ST.cont
	,lastname
	,firstname
	,adress
	,AA.Amount
from		AA
left join	@SomeTable ST on AA.Cont = ST.cont 

	
9 янв 13, 13:24    [13740869]     Ответить | Цитировать Сообщить модератору
 Re: Другой способ решения  [new]
aleks2
Guest
На какую тему конкурс?
9 янв 13, 13:27    [13740885]     Ответить | Цитировать Сообщить модератору
 Re: Другой способ решения  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
aleks2
На какую тему конкурс?


Наиболее дебильного вопроса дня.
9 янв 13, 13:32    [13740929]     Ответить | Цитировать Сообщить модератору
 Re: Другой способ решения  [new]
MaxiMaxiM
Member

Откуда:
Сообщений: 111
Ken@t,
как решить с помощью подзапроса?
9 янв 13, 13:33    [13740934]     Ответить | Цитировать Сообщить модератору
 Re: Другой способ решения  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
MaxiMaxiM
Скажите пожалуйста как иначе можно решить данную задачу, более рационально?

Для начала привести к нормальной форме.
Ответить на вопрос - критерий рациональности.
9 янв 13, 13:36    [13740961]     Ответить | Цитировать Сообщить модератору
 Re: Другой способ решения  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
MaxiMaxiM
Ken@t,
как решить с помощью подзапроса?
Решить что?
9 янв 13, 13:39    [13740993]     Ответить | Цитировать Сообщить модератору
 Re: Другой способ решения  [new]
MaxiMaxiM
Member

Откуда:
Сообщений: 111
iap,
найти итоговую сумму на каждой счете
9 янв 13, 13:41    [13741002]     Ответить | Цитировать Сообщить модератору
 Re: Другой способ решения  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
MaxiMaxiM
iap,
найти итоговую сумму на каждой счете

SELECT 
cont
	,lastname
	,firstname
	,adress
,SUM(summa) Amount

FROM @SomeTable AA
GROUP BY 
cont
	,lastname
	,firstname
	,adress
9 янв 13, 13:43    [13741017]     Ответить | Цитировать Сообщить модератору
 Re: Другой способ решения  [new]
456344
Guest
MaxiMaxiM
iap,
найти итоговую сумму на каждой счете


select   distinct ST.cont
	,lastname
	,firstname
	,adress
	,AA.Amount
        , Sum(summa)
from		AA
left join	@SomeTable ST on AA.Cont = ST.cont 

Group BY сам допиши
9 янв 13, 13:43    [13741020]     Ответить | Цитировать Сообщить модератору
 Re: Другой способ решения  [new]
235225
Guest
Все получиться. Сижу слушаю концерт Растроповича и прогаю. Благородно играет.

SQL любит точность.

Сообщение было отредактировано: 9 янв 13, 14:11
9 янв 13, 13:46    [13741040]     Ответить | Цитировать Сообщить модератору
 Re: Другой способ решения  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
456344
MaxiMaxiM
iap,
найти итоговую сумму на каждой счете


select   distinct ST.cont
	,lastname
	,firstname
	,adress
	,AA.Amount
        , Sum(summa)
from		AA
left join	@SomeTable ST on AA.Cont = ST.cont 

Group BY сам допиши

если там к примеру фамилия поменяется, то итоговую сумму на счету не найти. Тут только нормализация поможет, либо брать данные о клиенте по последней записи по счету
9 янв 13, 13:48    [13741063]     Ответить | Цитировать Сообщить модератору
 Re: Другой способ решения  [new]
Евгений Кульпин
Member

Откуда: Подольск
Сообщений: 56
https://www.google.ru/search?q=sum+over+partition+by&aq=0&oq=Sum+Over&aqs=chrome.1.57j0l3j62l2.6313&sugexp=chrome,mod=10&sourceid=chrome&ie=UTF-8
9 янв 13, 15:09    [13741821]     Ответить | Цитировать Сообщить модератору
 Re: Другой способ решения  [new]
вариант
Guest
MaxiMaxiM,
данные клиента берутся по последнему зачислению
SELECT s1.cont, SUM(s1.summa),s2.firstname,s2.lastname,s2.adress
FROM @SomeTable s1 JOIN
	(SELECT TOP 1 WITH TIES cont,lastname,firstname,adress
	 FROM @SomeTable
	 ORDER BY ROW_NUMBER() OVER(PARTITION BY cont ORDER BY member_no DESC)) s2 ON s1.cont = s2.cont
GROUP BY s1.cont,s2.firstname 
10 янв 13, 09:23    [13744924]     Ответить | Цитировать Сообщить модератору
 Re: Другой способ решения  [new]
вариант
Guest
только, конечно
GROUP BY s1.cont,s2.firstname,s2.lastname,s2.adress
10 янв 13, 09:25    [13744933]     Ответить | Цитировать Сообщить модератору
 Re: Другой способ решения  [new]
Евгений Кульпин
Member

Откуда: Подольск
Сообщений: 56
select distinct
cont, lastname, firstname, adress,
sum(summa) over(partition by cont)
from @SomeTable
10 янв 13, 10:11    [13745216]     Ответить | Цитировать Сообщить модератору
 Re: Другой способ решения  [new]
Евгений Кульпин
Member

Откуда: Подольск
Сообщений: 56
Т.е.
select distinct
  cont, lastname, firstname, adress,
  sum(summa) over(partition by cont)
from @SomeTable
10 янв 13, 10:13    [13745229]     Ответить | Цитировать Сообщить модератору
 Re: Другой способ решения  [new]
aleks2
Guest
Евгений Кульпин
Т.е.
select distinct
  cont, lastname, firstname, adress,
  sum(summa) over(partition by cont)
from @SomeTable


1. Не нада советовать фуфло. Результат такого запроса повергнет бедного аналитика в изумление. Стоит тока ошибиться в lastname or firstname or adress.

declare @SomeTable table(cont int, lastname nvarchar(128), firstname nvarchar(128), adress nvarchar(128), summa int)

insert @SomeTable
values
  (1, 'x', 'x', 'x', 1)
, (1, 'x', 'y', 'x', 2)

select distinct
  cont, lastname, firstname, adress,
  sum(summa) over(partition by cont)
from @SomeTable


2. Хотя тредстартер делает то же самое.
10 янв 13, 10:33    [13745372]     Ответить | Цитировать Сообщить модератору
 Re: Другой способ решения  [new]
Евгений Кульпин
Member

Откуда: Подольск
Сообщений: 56
aleks2, а что Вы считаете "фуфлом" ?
И что будет в случае ошибки?
Результаты в студию :-)
10 янв 13, 10:40    [13745418]     Ответить | Цитировать Сообщить модератору
 Re: Другой способ решения  [new]
invm
Member

Откуда: Москва
Сообщений: 9404
Евгений Кульпин
aleks2, а что Вы считаете "фуфлом" ?
И что будет в случае ошибки?
Результаты в студию :-)
Тут даже и ошибать не нужно:
1. Клиентка открыла счет, совершила несколько операций, затем вышла замуж и сменила фамилию. Потом совершила еще несколько операций.
2. Клиент переехал на новое место жительства.

Продолжить?

Не зря ТСу про нормализацию толкуют.
10 янв 13, 11:39    [13745786]     Ответить | Цитировать Сообщить модератору
 Re: Другой способ решения  [new]
Евгений Кульпин
Member

Откуда: Подольск
Сообщений: 56
invm, Суть была в том, что нужно посчитать остатки на счетах, дословно "найти итоговую сумму на каждой счете"
В моем решении, при смене ФИО, в результирующем наборе будет 2 строки с одинаковым номером и остатком на счете, но с разными ФИО. Остатки будут корректны, что и требовалось.
О нормализации здесь не спрашивалось, человек просил остатки на счетах.
Так что называть это фуфлом я бы не стал.
10 янв 13, 13:21    [13746538]     Ответить | Цитировать Сообщить модератору
 Re: Другой способ решения  [new]
Евгений Кульпин
Member

Откуда: Подольск
Сообщений: 56
invm, тем более, что это могут быть выгруженные данные, а не элемент ПО.
10 янв 13, 13:22    [13746554]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить