Mohamadkamal Ответов: 2

Как выполнить SQL-запрос для диапазона элементов?


в моей базе данных есть главная таблица (напр. Table_A). столбец 1 содержит название элементов, а столбец 6 - дату моей строки данных. Столбец 7 - это тип элементов столбца 1, которые находятся от А до Я.

например (некоторые строки таблицы Table_A):
|item_1  |200  |120  |300  |40   |201702  |type_A  |
|item_2  |210  |320  |340  |10   |201702  |type_A  |
|item_1  |150  |30   |70   |38   |201703  |type_A  |
|item_2  |315  |220  |120  |40   |201703  |type_A  |
|item_3  |40   |500  |110  |35   |201702  |type_B  |
|item_4  |758  |78   |152  |61   |201702  |type_B  |
|item_3  |778  |920  |12   |330  |201703  |type_B  |
|item_4  |315  |220  |120  |40   |201703  |type_B  |

теперь я хочу показать элементы из каждого типа в столбце 7 с определенной даты (например, 201703), а затем ниже этой суммы столбца 2, суммы столбца 3, суммы столбца 4, суммы столбца 5.а затем ниже той скорости роста, которая вычисляется в функции (((сумма месяца / сумма предыдущего месяца)*100)-100)

и для приведенного выше примера результат, который я хочу, таков:
|item_1  |150  |30   |70   |38   |201703  |type_A  |
|item_2  |315  |220  |120  |40   |201703  |type_A  |
|sum     |465  |250  |190  |78   |201703  |type_A  |
|rate    |13.1 |-43.1|-74.3|56   |201703  |type_A  |
|item_3  |778  |920  |12   |330  |201703  |type_B  |
|item_4  |315  |220  |120  |40   |201703  |type_B  |
|sum     |1093 |1140 |132  |370  |201703  |type_B  |
|rate    |36.96|97.23|-18.5|285.4|201703  |type_B  |


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

(
	SELECT 	col1, col2, col3, col4, col5, col6, col7
	FROM	Table_A INNER JOIN Table_B ON Table_A.col1 = Table_B.col1
	WHERE  	Table_A.col6 = 201703 AND (Table_A.col7 = 'type_A')
)
UNION ALL
(
	SELECT 	'sum', SUM(col2), SUM(col3), SUM(col4), SUM(col5), 201703, 'type_A'
	FROM	Table_A INNER JOIN Table_B ON Table_A.col1 = Table_B.col1
	WHERE  	Table_A.col6 = 201703 AND (Table_A.col7 = 'type_A')
) --sum of data with 'g'
UNION ALL
(
SELECT 
	N'Rate',
	(
		ROUND
		(
			(
				(
					(
						(
							SELECT	CONVERT (FLOAT,SUM(col2))
							FROM	Table_A 
							WHERE  	Table_A.col6 = 201703 AND (Table_A.col7 = 'type_A')
						)
						/
						(
							SELECT	CONVERT (FLOAT,SUM(col2))
							FROM	Table_A 
							WHERE  	Table_A.col6 = (201703 - 1) AND (Table_A.col7 = 'type_A')
						)
					 )*100
				)-100
			),2
		)
	)
	,
	(
		ROUND
		(
			(
				(
					(
						(
							SELECT	CONVERT (FLOAT,SUM(col3))
							FROM	Table_A 
							WHERE  	Table_A.col6 = 201703 AND (Table_A.col7 = 'type_A')
						)
						/
						(
							SELECT	CONVERT (FLOAT,SUM(col3))
							FROM	Table_A 
							WHERE  	Table_A.col6 = (201703 - 1) AND (Table_A.col7 = 'type_A')
						)
					)*100
				)-100
			),2
		)
	)
	,
	(
		ROUND
		(
			(
				(
					(
						(
							SELECT	CONVERT (FLOAT,SUM(col4))
							FROM	Table_A 
							WHERE  	Table_A.col6 = 201703 AND (Table_A.col7 = 'type_A')
						)
						/
						(
							SELECT	CONVERT (FLOAT,SUM(col4))
							FROM	Table_A 
							WHERE  	Table_A.col6 = (201703 - 1) AND (Table_A.col7 = 'type_A')
						)
					)*100
				)-100
			),2
		)
	)
	,
	(
		ROUND
		(
			(
				(
					(
						(
							SELECT	CONVERT (FLOAT,SUM(col5))
							FROM	Table_A 
							WHERE  	Table_A.col6 = 201703 AND (Table_A.col7 = 'type_A')
						)
						/
						(
							SELECT	CONVERT (FLOAT,SUM(col5))
							FROM	Table_A 
							WHERE  	Table_A.col6 = (201703 - 1) AND (Table_A.col7 = 'type_A')
						)
					)*100
				)-100
			),2
		)
	)
	,
	NULL
	,
	'type_A'
)


но этот код показывает только один тип из столбца 7.

2 Ответов

Рейтинг:
2

itsmypassion

Попробуйте следовать коду followig

SELECT COL1,COL2,COL3 ,COL4 ,COL5 ,COL6 ,COL7  FROM TABLE_A WHERE COL7='TYPE_A' AND COL6 = '201703'
UNION ALL
SELECT 'SUM' AS COL1,SUM(COL2),SUM(COL3) ,SUM(COL4) ,SUM(COL5) ,COL6 ,MAX(COL7)  FROM TABLE_A GROUP BY COL6,COL7 HAVING COL6 ='201703' AND COL7='TYPE_A'

UNION ALL

---RATE CALCULATION
SELECT A.COL1,(((A.COL2/CAST(B.COL2PREV AS FLOAT ))*100)-100) AS COL2 ,
(((A.COL3/CAST(B.COL3PREV AS FLOAT ))*100)-100) AS COL3 ,
(((A.COL4/CAST(B.COL4PREV AS FLOAT ))*100)-100) AS COL4 ,
(((A.COL5/CAST(B.COL5PREV AS FLOAT ))*100)-100) AS COL5 ,
A.COL6 AS COL6,A.COL7 AS COL7
FROM
(SELECT 'RATE' AS COL1,SUM(COL2) COL2,SUM(COL3) COL3 ,SUM(COL4) COL4,SUM(COL5) COL5 ,COL6 ,MAX(COL7) COL7  FROM TABLE_A GROUP BY COL6,COL7 HAVING COL6 ='201703' AND COL7='TYPE_A') AS A,

(SELECT 'RATE' AS COL1PREV,SUM(COL2) COL2PREV,SUM(COL3) COL3PREV ,SUM(COL4) COL4PREV,SUM(COL5) COL5PREV,COL6 ,MAX(COL7) AS COL7PREV  FROM TABLE_A GROUP BY COL6,COL7 HAVING COL6 ='201702' AND COL7='TYPE_A') AS B

UNION ALL
SELECT COL1,COL2,COL3 ,COL4 ,COL5 ,COL6 ,COL7  FROM TABLE_A WHERE COL7='TYPE_B' AND COL6 = '201703'
UNION ALL
SELECT 'SUM' AS COL1,SUM(COL2),SUM(COL3) ,SUM(COL4) ,SUM(COL5) ,COL6 ,MAX(COL7)  FROM TABLE_A GROUP BY COL6,COL7 HAVING COL6 ='201703' AND COL7='TYPE_B'
UNION ALL
SELECT A.COL1,(((A.COL2/CAST(B.COL2PREV AS FLOAT ))*100)-100) AS COL2 ,
(((A.COL3/CAST(B.COL3PREV AS FLOAT ))*100)-100) AS COL3 ,
(((A.COL4/CAST(B.COL4PREV AS FLOAT ))*100)-100) AS COL4 ,
(((A.COL5/CAST(B.COL5PREV AS FLOAT ))*100)-100) AS COL5 ,
A.COL6 AS COL6,A.COL7 AS COL7
FROM
(SELECT 'RATE' AS COL1,SUM(COL2) COL2,SUM(COL3) COL3 ,SUM(COL4) COL4,SUM(COL5) COL5 ,COL6 ,MAX(COL7) COL7  FROM TABLE_A GROUP BY COL6,COL7 HAVING COL6 ='201703' AND COL7='TYPE_B') AS A,

(SELECT 'RATE' AS COL1PREV,SUM(COL2) COL2PREV,SUM(COL3) COL3PREV ,SUM(COL4) COL4PREV,SUM(COL5) COL5PREV,COL6 ,MAX(COL7) AS COL7PREV  FROM TABLE_A GROUP BY COL6,COL7 HAVING COL6 ='201702' AND COL7='TYPE_B') AS B


Mohamadkamal

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

itsmypassion

В этом случае вы можете сгенерировать динамический запрос с помощью цикла.

https://www.codeproject.com/Articles/20815/Building-Dynamic-SQL-In-a-Stored-Procedure

Mujeebahmad

попробуйте решение 2. оно работает!!

Рейтинг:
2

Mujeebahmad

Результат, который вы хотите получить, достигается с помощью приведенного ниже SQL-запроса..

--Подготовка образцов данных
создайте таблицу #Table_A(col1 varchar(50), col2 numeric(18,2), col3 numeric(18,2), col4 numeric(18,2), col5 numeric(18,2), col6 varchar(10), col7 varchar(50))
вставить в #Table_A
значения('item_1',200,120,300,40,'201702','type_a атомизатора')

вставить в #Table_A
значения('item_2',210,320,340,10,'201702','type_a атомизатора')

вставить в #Table_A
значения('item_1',150,30 ,70 ,38 ,'201703','type_A')

вставить в #Table_A
значения('item_2',315,220,120,40 ,'201703','type_a атомизатора')

вставить в #Table_A
значения('item_3',40 ,500,110,35 ,'201702','type_B')

вставить в #Table_A
значения('item_4',758,78 ,152,61 ,'201702','type_B')

вставить в #Table_A
значения('item_3',778,920,12 ,330,'201703','type_B')

вставить в #Table_A
значения('item_4',315,220,120,40 ,'201703','type_B')
---------------------------------
--Входной параметр---------------
Объявите @Month varchar(6),@prevMonth varchar(6)
set @Month='201703'
set @prevMonth='201702'
---------------------------------
выберите * из списка (
выберите функции row_number() над(раздел по col7 порядке по столбцу col1) как сльно,столбец col1,столбец col2,с col3,col4,col5,col6,col7 от #Table_A где col6=@месяц
союз всех
выберите графу(столбец col1)+1 Как сльно,'сумма' следующим образом: col1,сумма(столбец col2) в столбец col2,сумма(кол3) как кол3,сумма(col4) как col4,сумма(col5) как col5,col6,col7 от #Table_A где col6=@месяц группы по col6,col7
союз всех
выберите count(tmp2.col2)+2 как SlNo,'Rate' как col1,
((сумма(tmp2.столбец col2)/(
выберите sum(col2) из #Table_A, где col6=@prevMonth и col7=tmp2.col7))*100)-100 как col2,
((сумма(tmp2.кол3)/(
выберите sum(col3) из #Table_A, где col6=@prevMonth и col7=tmp2.col7))*100)-100 как col3,
((сумма(tmp2.col4)/(
выберите sum(col4) из #Table_A, где col6=@prevMonth и col7=tmp2.col7))*100)-100 как col4,
((сумма(tmp2.col5)/(
выберите sum(col5) из #Table_A, где col6=@prevMonth и col7=tmp2.col7))*100)-100 как col5,
tmp2.col6,tmp2.col7 из #Table_A tmp2, где tmp2.col6=@Month группа по tmp2.col6,tmp2.col7) t заказ по col7,SlNo
--Удаление временных данных-----
падение таблица № Table_A
----КОНЕЦ-------------