2015-09-15 5 views
-1

Я имею отборное заявление получения результатов, как показано нижеКак разделить оператор select на несколько таблиц?

ID Name CASETYPE 
1 Anil TR 
2 Sam  CR 
3 Samuel TR 
4 Satish CR 
5 Kumar CI 

Мой запрос является:

SELECT max(ID),max(Name),casetype FROM TABLE GROUP BY CASETYPE 

Ожидаемый выход:

table1

ID Name CASETYPE 
1 Anil TR 
2 Samuel TR 

table2

ID Name CASETYPE  
1 Sam  CR 
2 Satish CR 

Table3

ID Name CASETYPE  
1 Kumar CI 
+1

ли SQL Server действительно принимает "SELECT * FROM TABLE GROUP BY CASETYPE"?!? – jarlh

+1

Итак, вы хотите вернуть 3 набора результатов? –

+0

Как выглядят данные вашей таблицы в этом случае? – jarlh

ответ

1

Я не знаю, почему вы хотите это сделать. Но вот один из способов, используя CURSOR и динамический SQL:

DECLARE @caseType VARCHAR(2) 
DECLARE @sql NVARCHAR(MAX) 

DECLARE cur CURSOR LOCAL FAST_FORWARD FOR 
    SELECT DISTINCT CaseType FROM tbl ORDER BY CaseType DESC 

OPEN cur 
FETCH FROM cur INTO @caseType 

WHILE @@FETCH_STATUS = 0 BEGIN 
    SET @sql = 'SELECT ID = ROW_NUMBER() OVER(ORDER BY ID), Name, CaseType FROM tbl WHERE CaseType = @caseType' 

    EXEC sp_executesql @sql, N'@caseType VARCHAR(2)', @caseType 

    FETCH FROM cur INTO @caseType 
END 

CLOSE cur 
DEALLOCATE cur 
+0

Это динамично и должно работать лучше по сравнению с другим ответом. +1 – KrazzyNefarious

+0

@Vic, OP хотел получить индивидуальный результат для каждого 'CASETYPE'. Если «CASETYPE» известны, тогда нет необходимости в «CURSOR» и динамическом SQL. Достаточно трех отдельных запросов с предложением 'WHERE' для каждого' CASETYPE'. Однако, если есть неизвестное количество 'CASETYPES',' CURSOR' и динамический SQL будут лучше. –

1

Я не понимаю, как вы ожидаете, что ваш текущий запрос, чтобы вернуть более 1 строку для каждого casetype, то aggrigates будет возвращать только 1 строку в casetype.

Невозможно разбить выделение на разные таблицы. Попробуйте вместо этого:

CREATE table table1(ID int identity(1,1), Name varchar(10), CASETYPE char(2)) 
CREATE table table2(ID int identity(1,1), Name varchar(10), CASETYPE char(2)) 
CREATE table table3(ID int identity(1,1), Name varchar(10), CASETYPE char(2)) 

INSERT table1(Name, CASTTYPE) 
SELECT Name, CASETYPE 
FROM yourtable 
WHERE CASETYPE = 'TR' 


INSERT table2(Name, CASTTYPE) 
SELECT Name, CASETYPE 
FROM yourtable 
WHERE CASETYPE = 'CR' 

INSERT table3(Name, CASTTYPE) 
SELECT Name, CASETYPE 
FROM yourtable 
WHERE CASETYPE = 'CI' 
0
begin 
Declare @temp1 Table 
(
    caseType varchar(2) 
) 
Declare @ResultTable Table 
(
    id int, 
    name varchar(50), 
    casetype varchar(2) 
) 
Insert into @temp1 
select distinct casetype from Table_1 
Declare @caseType varchar(2) 
While((Select Count(*) From @temp1)>0) 
Begin 
    Set @caseType=(Select Top 1 casetype From @temp1) 

    Insert Into @ResultTable 
    select * from Table_1 Where [email protected] 

    select * from @ResultTable 

    delete from @ResultTable 
    Delete @temp1 Where [email protected] 
End 
end 
0
DECLARE @CaseTypeCount TINYINT   --Variable to store the Distinct case type count 
DECLARE @IteratorForCaseType TINYINT = 1 --Iterator for looping 

/* get the ditinct case type count */ 
SELECT @CaseTypeCount = COUNT(DISTINCT CASETYPE) FROM YourTable 

/* Loop for all distinct case types */ 
WHILE (@IteratorForCaseType<= @CaseTypeCount) 
BEGIN 
/* Use a Common table expression to manipulate thetemperory results */ 
;WITH CTE AS 
(
SELECT 
ROW_NUMBER() OVER (ORDER BY CASETYPE DESC) AS RowID, 
CASETYPE 
FROM 
YourTable 
GROUP BY 
CASETYPE 
) 

SELECT 
ROW_NUMBER() OVER (ORDER BY ID) AS ID 
,Name 
,YourTable.CASETYPE 
FROM CTE 
INNER JOIN 
YourTable 
ON YourTable.CASETYPE = CTE.CASETYPE 
WHERE RowID = @IteratorForCaseType 

SET @IteratorForCaseType +=1 

END 
Смежные вопросы