2015-05-08 3 views
2

У меня есть table aПодавать данных в SQL Server

Name District Source Revenue 
Dave 34  A  120 
John 36  B  140 
Juyt 38  C  170 

table b И

Name District Product Cost 
Dave 34  A  50 
John 36  B  40 

Я хочу вид, как так. Желаемый вид ниже.

Name District Source Revenue A B Total Cost 
Dave 34  A  120  50 0  50 
John 36  B  140  0 40 40 
Juyt 38  C  170  0 0  0 

Количество изделий не фиксировано для каждого поиска в таблице b. Есть ли способ отключиться, когда количество продуктов, таких как Product A, Product B, не исправлено. Я не хочу делать динамический SQL и динамический univot. Есть ли другой способ получить желаемый вид?

+3

Вы спросили, Нет. Динамический SQL - единственный выбор, когда у вас есть неопределенное количество столбцов в своде. – xQbert

+3

В основном вы спрашиваете, есть ли способ выполнить точку опоры, не называя столбцы индивидуально, и не делая этого с динамическим SQL. ** Я разделяю ваше желание и действительно желаю, чтобы был лучший вариант **, но, к сожалению, это было задано раньше и ответили здесь: http://stackoverflow.com/questions/2170058/can-sql-server-pivot-without -knowing-the-result-column-names – AaronLS

+2

"* Есть ли способ отключить динамический набор категорий без использования Dynamic SQL? *« Да. Но не с T-SQL. Excel (и другие инструменты) могут сделать это просто отлично. Если вы хотите сделать это на SQL Server, то, как говорили другие, вам нужен динамический SQL. – RBarryYoung

ответ

1

«там Существует какой-либо другой вариант, чтобы получить желаемый вид?» На основе ваших данных выборки я дал вам выход

declare @t table (name varchar(10),District int,Source varchar(2),Revenue int) 
insert into @t (name,District,Source,Revenue)values ('dave',34,'A',120), 
('john',36,'B',140),('juyt',38,'C',170) 

declare @tt table (name varchar(10),District int,product varchar(2),cost int) 
insert into @tt (name,District,product,cost)values ('dave',34,'A',50), 
('john',36,'B',40) 


select A.name,A.District,A.Source,A.Revenue,A.A,A.B, 
SUM(A + B) TotalCost from (
select t.name, 
t.District, 
t.Source, 
t.Revenue, 
CASE WHEN tt.product = 'A' THEN cost ELSE 0 END A , 
CASE WHEN tt.product = 'B' THEN cost ELSE 0 END B 
from @t t 
left join @tt tt on 
t.name = tt.name 
AND 
t.District = tt.District)A 
GROUP BY A.name,A.District,A.Source,A.Revenue,A.A,A.B 
Смежные вопросы