Как удалить несколько записей из SQL

#sql #sql-server #tsql

#sql #sql-сервер #tsql

Вопрос:

У меня есть такой запрос :

 SELECT        dbo.[Work].WorkId ,  dbo.Floor.RoomType
FROM            dbo.Municipality INNER JOIN
                         dbo.[Work] ON dbo.Municipality .MunicipalityID = dbo.[Work].MunicipalityId INNER JOIN
                         dbo.Look ON dbo.[Is].LookWorkId = dbo.Look.LookId INNER JOIN
                         dbo.Kat ON dbo.Look.LookId = dbo.Kat.Look_LookId
WHERE        (dbo.Look.LocationIS NOT NULL)
  

Это возвращает такой результат :

IsId — RoomType

  • 5402 — 8
  • 5402 — 6
  • 5402 — 1
  • 5402 — 2
  • 5402 — 4
  • 5402 — 3
  • 5404 — 8
  • 5404 — 6
  • 5404 — 1
  • 5404 — 2
  • 5404 — 4

Но я хочу изменить этот результат на следующий: если IsID имеет 8 6 1 2 4 3, это будет так :

 IsId  => 5402  RoomType1 => 1  RoomType2 =>1 RoomType3 => 1 RoomType4 =>1 RoomType5 =>0 Room Type6 =>1  RoomType7 => 0  RoomType8 =>1
  

Я могу сделать это (case when dbo.Floor.RoomType=1 then 1 else 0 end) as RoomType1,

Но это не мешает ему иметь несколько записей. Как я должен изменить запрос, чтобы сделать несколько записей одной записью, как я объяснил выше? Любая помощь приветствуется. Спасибо.

Комментарии:

1. Является ли количество типов комнат статическим (всегда будет только 8) или оно динамическое, и количество типов может расти?

2. @iamdave Они статические, максимум 8, минимум 1. Спасибо.

Ответ №1:

Это должно сработать 🙂

Добавлен еще один столбец, как обсуждалось:

 SELECT         IsId, KayitTarihi, sum(RoomType1) As RoomType1, sum(RoomType2) As RoomType2, sum(RoomType3) As RoomType3, sum(RoomType4) As RoomType4, sum(RoomType5) As RoomType5, sum(RoomType6) As RoomType6, sum(RoomType7) As RoomType7, sum(RoomType8) As RoomType8
FROM (

SELECT     dbo.[Is].IsId, dbo.[Is].KayitTarihi, 

case dbo.Kat.OdaTipi when 1 then 1 else 0 end as RoomType1,
        case dbo.Kat.OdaTipi when 2 then 1 else 0 end as RoomType2,
        case dbo.Kat.OdaTipi when 3 then 1 else 0 end as RoomType3,
        case dbo.Kat.OdaTipi when 4 then 1 else 0 end as RoomType4,
        case dbo.Kat.OdaTipi when 5 then 1 else 0 end as RoomType5,
        case dbo.Kat.OdaTipi when 6 then 1 else 0 end as RoomType6,
        case dbo.Kat.OdaTipi when 7 then 1 else 0 end as RoomType7,
        case dbo.Kat.OdaTipi when 8 then 1 else 0 end as RoomType8

FROM            dbo.Belediye INNER JOIN
                         dbo.[Is] ON dbo.Belediye.BelediyeId = dbo.[Is].BelediyeIsId INNER JOIN
                         dbo.YerGorme ON dbo.[Is].YerGormeIsId = dbo.YerGorme.YerGormeId INNER JOIN
                         dbo.Kat ON dbo.YerGorme.YerGormeId = dbo.Kat.YerGorme_YerGormeId
WHERE        (dbo.YerGorme.Lokasyon IS NOT NULL)

) E
GROUP BY IsId, KayitTarihi
  

Комментарии:

1. Спасибо за ваш ответ. но в требованиях нет суммы, должно быть только 1 или 0, спасибо.

2. ПРИВЕТ, Джейсон, это не фактическая сумма. Это рабочая логика, которая вам нужна. Просто выполните код, посмотрите результат и проверьте. Я сделал и проверил, и это именно то, что вам нужно. Смотрите Логику обращения внутри и группируйте снаружи, она не суммирует ваши данные, как вы поняли.

3. Это приведет только к 1 и 0. Пожалуйста, выполните и посмотрите результат.

4. @Aruna Зачем вам копировать pivot функциональность, не используя только pivot таблицу?

5. Я проверил ваш запрос, и он работает как шарм, у меня один вопрос: ) E что делает эта строка? Спасибо.

Ответ №2:

Поскольку у вас есть статическое количество RoomTypes, a pivot лучше всего подходит для этого типа задач. Просто замените свой запрос на то, где у меня есть select .. from @a :

 declare @a table (ID int, RoomType int);
insert into @a values
 (1,1)
,(1,3)
,(1,7)
,(1,8)
,(2,1)
,(2,2)
,(2,4)
,(2,5)
,(3,6)
,(3,8);

select ID
        ,case when [1] is not null then 1 else 0 end as RoomType1
        ,case when [2] is not null then 1 else 0 end as RoomType2
        ,case when [3] is not null then 1 else 0 end as RoomType3
        ,case when [4] is not null then 1 else 0 end as RoomType4
        ,case when [5] is not null then 1 else 0 end as RoomType5
        ,case when [6] is not null then 1 else 0 end as RoomType6
        ,case when [7] is not null then 1 else 0 end as RoomType7
        ,case when [8] is not null then 1 else 0 end as RoomType8
from(
    select ID
            ,RoomType
    from @a
    ) src
pivot
(
    max(RoomType)
    for RoomType in([1],[2],[3],[4],[5],[6],[7],[8])
) pvt;
  

В частности, в вашем случае:

 select IsId
        ,case when [1] is not null then 1 else 0 end as RoomType1
        ,case when [2] is not null then 1 else 0 end as RoomType2
        ,case when [3] is not null then 1 else 0 end as RoomType3
        ,case when [4] is not null then 1 else 0 end as RoomType4
        ,case when [5] is not null then 1 else 0 end as RoomType5
        ,case when [6] is not null then 1 else 0 end as RoomType6
        ,case when [7] is not null then 1 else 0 end as RoomType7
        ,case when [8] is not null then 1 else 0 end as RoomType8
from(
    select i.IsId
            ,k.OdaTipi as RoomType

    from dbo.Belediye b
        inner join dbo.[Is] i
            on b.BelediyeId = i.BelediyeIsId
        inner join dbo.YerGorme y
            ON i.YerGormeIsId = y.YerGormeId
        inner join dbo.Kat k
            ON y.YerGormeId = k.YerGorme_YerGormeId

    where y.Lokasyon IS NOT NULL
    ) src
pivot
(
    max(RoomType)
    for RoomType in([1],[2],[3],[4],[5],[6],[7],[8])
) pvt;
  

Комментарии:

1. Извините, но я новичок в SQL, и я не мог заменить свой запрос вашим. Не могли бы вы обновить свой ответ? Спасибо.

2. @jason Ответ обновлен, чтобы включить ваш код (а также немного очистить его).

Ответ №3:

попробуйте цикл курсора SQL

 declare @ID int
declare @ODATIPI nvarchar(100)
DECLARE db_cursor CURSOR FOR  
SELECT        dbo.[Is].IsId as ID,  dbo.Kat.OdaTipi as ODATIPI
FROM            dbo.Belediye INNER JOIN
                         dbo.[Is] ON dbo.Belediye.BelediyeId = dbo.[Is].BelediyeIsId INNER JOIN
                         dbo.YerGorme ON dbo.[Is].YerGormeIsId = dbo.YerGorme.YerGormeId INNER JOIN
                         dbo.Kat ON dbo.YerGorme.YerGormeId = dbo.Kat.YerGorme_YerGormeId
WHERE        (dbo.YerGorme.Lokasyon IS NOT NULL)
OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @ID,@ODATIPI

WHILE @@FETCH_STATUS = 0   
BEGIN   

       -- Do work

       FETCH NEXT FROM db_cursor INTO @ID,@ODATIPI
END   

CLOSE db_cursor   
DEALLOCATE db_cursor
  

Комментарии:

1. Можете ли вы дать немного больше советов о части «Do work»? Большое вам спасибо.

2. Курсор определенно не требуется. Это простое манипулирование данными и cursor снижает производительность запросов.