Member 13863605 Ответов: 1

Сложите сумму всех столбцов по часам


У меня есть два стола, список гостей и список клиентов. Я присоединился к ним и использовал динамическую сводную таблицу SQL для преобразования столбца "город" из таблицы GuestList в строки или заголовки таблиц, и среднее население будет отображаться под каждым городом. Таким образом, после выполнения запроса внизу моя таблица выглядит следующим образом, и среднее население отображается под каждым городом.

Time   | Atl_1  | Atl_2  | Atl_3 | NY_1 | NY_2
02/12  | 300    |120     |550    | 548  | 784
02/12  | 140    |100     |720    | 369  | 985

У меня также есть возможность суммировать все население городов в ASP.Net-да. Так как же мне сложить все общее население городов и показать вот так?

Примечание: название моего города будет динамичным. Таким образом, пользователь может выбрать любой город из ASP.Чистая опция выпадающего списка, поэтому сумма также должна быть динамической, а не добавляться вручную для каждого города, так как мы не знаем, какой город пользователь собирается выбрать.

Time   | Atl_ALL  | NY_ALL  
02/12  |970      |1332    
02/13  | 960      |1354


Что я уже пробовал:

Ниже приведен динамический sql-запрос:

declare @ColumnNames nvarchar(max) = ''
declare @SQL nvarchar(max) = ''

select @ColumnNames += QUOTENAME(a.address) + ','
from GuestList as a
inner join CustomerList as b
on a.Id = b.Id
group by a.address
order by a.address 

set @ColumnNames = left(@ColumnNames, LEN(@ColumnNames)-1  )

set @SQL= N'
select Time,' + @ColumnNames + '
from 
(
select a.Time, a.city, a.population, b.Gender
from GuestList as a
inner join CustomerList as b
on a.Id = b.Id
inner join Split(@city, '','') as c
on a.city = c.Data
where a.city = c.Data
) as SourceTable
pivot
(avg(population) 
for city 
in (' 
    + @ColumnNames + 
    ')) as PivotTable
order by Time'


execute sp_executesql @SQL,
                        N'@city nvarchar(max)'
                        ,@city = @city

RedDk

цитата: "Я присоединился к ним"...

Таким образом, эти цифры являются суммами для каждого (столбца) "адреса"?

А клиенты-это то же самое, что и гости? Я не понимаю.

Member 13863605

Ну, это ты пытаешься все усложнить! Это t-sql, а не английская литература, в которой вы пытаетесь сказать, что клиенты-это то же самое, что и гости. Я ясно сказал, что это разные таблицы!!!

Santosh kumar Pithani

Почему вы используете "a.address" и "a.city" для списка сводных столбцов ?

1 Ответов

Рейтинг:
2

Santosh kumar Pithani

---first export pivot records into ## global table(i used #temp for showing purpose)
--i have used String_split() instead of your Split() function.. 

CREATE TABLE #TEMP(Time varchar(50),Atl_1  int, Atl_2  int, Atl_3 int, NY_1 int, NY_2 int)
INSERT INTO #TEMP
VALUES
('02/12'  , 300,120 ,550, 548, 784)
,('02/13'  , 140,100 ,720, 369, 985);

DECLARE @query nvarchar(max),@list varchar(max)='Atl_1,Atl_2,Atl_3,NY_1,NY_2';

WITH CTE AS(
  select DISTINCT 
        Stuff((select DISTINCT '+SUM('+value+')' from string_split(@list,',') as dd where dd.value like '%'+substring(ss.value,1,charindex('_',ss.value))+'%'  for xml path('')),1,1,'')+' AS '+substring(ss.value,1,charindex('_',ss.value))+'ALL' as  pcols FROM   string_split(@list,',') as ss
           )
SELECT @list=Stuff((select ','+Pcols from CTE for XML Path('')),1,1,'')

SET @query=N'select time,'+@list+' from #TEMP GROUP BY time';

EXEC(@query);


Member 13863605

Примечание: название моего города будет динамичным. Таким образом, пользователь может выбрать любой город из ASP.Чистая опция выпадающего списка, поэтому сумма также должна быть динамической, а не добавляться вручную для каждого города, так как мы не знаем, какой город пользователь собирается выбрать.

Так что ваш один я должен жестко закодировать, чего я не могу. Здесь около сотни городов. Я не могу жестко запрограммировать 100 городов. Пожалуйста, предложите решение, которое было бы динамичным, а не жестким кодированием.

Santosh kumar Pithani

Здравствуйте, у меня есть обновления нового решения, поэтому, пожалуйста, проверьте и дайте мне знать.

Member 13863605

Привет,
Вы все еще упорно кодируете города! Она должна быть динамичной. При динамическом смысле существует несколько сотен городов примеры и пользователь может выбрать любой из них. Е. Г. если пользователь выбирает АТЛ, тогда у нас будут отображаться все суммы всех значений АТЛ, если пользователь выбирает ATL и Нью-Йорк, мы будем показывать все суммы всех значений ATL и Нью-Йорк и если пользователь выбирает АТЛ,Чикаго и Нью-Йорк, мы будем показывать все суммы всех значений АТЛ, Чикаго и Нью-Йорк.
Таким образом, вы жестко кодируете города в таблице temp. Это не сработает, потому что мы не знаем, какой город выберет пользователь.

Santosh kumar Pithani

Вы выполнили запрос ?Используйте @ColumnNames вместо @list.
set @SQL= N'
выберите время,' + @ColumnNames + ' в ##temp
от ...и т. д. После этого,использовать в случае, если условие