sekar305 Ответов: 1

Как выбрать результирующие строки в одном столбце В SQL server


i have two tables  table 1 get single value and table 2 more than value in same id

I have a table like this:

+-------+------+------+
|No     |code  | qty  |
+-------+------+------+
|1055   |956   |  10  |
+-------+------+------+
|1055   |957   |  9   |
+-------+------+------+
|1055   |958   |  5   |
+-------+------+------+
|1055   |959   |  4   |
+-------+------+------+
|1055   |960   |  3   |
+-------+------+-----+
 
i need rows value in single column without using sub query
The output should be something like:

+------+----------------+----------+
|No    |code   |           qty     |
+------+----------------+----------+
|1055  |956,957,958,959 | 10,9,5,4 |
+------+------+---------+----------+

how to get value using sql server 


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

 SELECT   Stuff( (SELECT N','+ table1.code
 from table1   inner join table2 on  table1.no=table2.no
where table1.trackno in ('17-05-SC-0009') order by table1.trackno desc
     For XML PATH (''),TYPE).value('text()[1]','nvarchar(max)'),1,1,N'') as [MobileNos]

CHill60

Вы говорите, что у вас есть два стола, но вы показали нам только один из них и не сказали, какой именно!
Также объясните, что не так с кодом, который у вас уже есть.
Также, Пожалуйста, объясните, почему у вас не может быть подзапроса

sekar305

1.in Таблица 1, имеющая номер (1-й столбец) и вторая таблица 2, имеющая номер, код, кол-во
когда я был внутренним соединением, это означает, что он показывает дублирование, похожее на приведенную выше таблицу,




(экс:

+-------+------+------+
|Нет / код | кол-во |
+-------+------+------+
|1055 |956 | 10 |
+-------+------+------+
|1055 |957 | 9 |
+-------+------+------+
|1055 |958 | 5 |
+-------+------+------+
|1055 |959 | 4 |
+-------+------+------+
|1055 |963 | 3 |
+-------+------+------+
|1056 |958 | 5 |
+-------+------+------+
|1056 |959 | 4 |

2. в моем коде все значения строк отображаются в одном столбце
+------+----------------+--------------+
|Нет / код | кол-во |
+------+----------------+---------------+
|1055 |956,957,958,959 | 10,9,5,4,5,4 |
+------+------+---------+--------------+

1 Ответов

Рейтинг:
5

CHill60

Единственное, что вы пропустили в своем запросе, - это GROUP BY предложение, но используя for XML PATH, вам придется использовать коррелированные подзапросы, я думаю.

SELECT
    t1.[no]
        ,STUFF((SELECT ', ' + cast(t2.code as varchar)
               FROM test t2
               WHERE t1.[no]=t2.[no] ORDER BY t2.code
               FOR XML PATH(''), TYPE).value('text()[1]','nvarchar(max)'),1,1, N'') AS codes

        ,STUFF((SELECT ', ' + cast(t2.qty as varchar)
               FROM test t2
               WHERE t1.[no]=t2.[no] ORDER BY t2.code
               FOR XML PATH(''), TYPE).value('text()[1]','nvarchar(max)'),1,1, N'') AS qtys
FROM test t1
GROUP BY t1.[no]
Что и дает результаты
No       Codes                           Qtys
1055	 956, 957, 958, 959, 960	 10, 9, 5, 4, 3
1056	 958, 959	                 5, 4
[Примечание - Я только что создал тест таблицы, в котором были ваши данные из вопроса - замените "тест" на ваше соединение таблиц]

Если вы абсолютно не можете использовать подзапросы, то вы можете использовать COALESCE, но единственный способ, которым я мог бы получить тот чтобы работа была с петлей (фу!) подобный этому
DECLARE @start int = (SELECT CAST(MIN([No]) AS Int) FROM test)
DECLARE @end int = (SELECT CAST(MAX([No]) AS Int) FROM test)
DECLARE @results table ([no] varchar(4), codes varchar(max), qtys varchar(max))
WHILE @start <= @end
BEGIN
	DECLARE @listCode VARCHAR(MAX) = null
	DECLARE @listQty VARCHAR(MAX) = null
	SELECT  @listCode = COALESCE(@listCode+',' ,'') + CAST(code AS Varchar),
		@listQty = COALESCE(@listQty+',' ,'') + CAST(qty AS Varchar)
	FROM test
	WHERE [no] = CAST(@start AS Varchar)
	
	IF @listCode IS NOT NULL
	BEGIN
		INSERT INTO @results  ([no], codes, qtys) VALUES (cast(@start as varchar), @listCode, @listQty)
	END

	SET @start += 1
END
SELECT * FROM @Results


sekar305

но нет, и код (столбец) - это тип данных varchar , кол-во только числовое

CHill60

Я обновил цикл, чтобы удовлетворить [нет] быть варчаром. Кстати, использовать varchar для хранения чисел-очень плохая практика.

Maciej Los

5 за старание!