SQL - zapytanie z wielu wierszy do jednego.

0

Cześć,
Mam dane zapisane w tabeli w formie jak poniżej:
Tabela TValue:
screenshot-20180227145720.png

Celem jest przedstawienie tych danych w formie

Type.Name | Color.Name | R1 (RobotId =1).Value[9] | R2 (RobotId = 2).Value[9] | R3 (RobotId = 3).Value[9] | R4 (RobotId = 4).Value[9]

Główne dane są przechowywane w formie:
Tabela TValueSet:
screenshot-20180227145631.png

Chodzi o to aby wyrzucić wartości z IdSignal = 9 dla tego samego IdValueSet przy różnych wartościach IdRobot
Wszystkie tabele wyglądają tak:

Tabela TColor:
screenshot-20180227145747.png
Tabela TBody
screenshot-20180227145806.png
Tablea TType:
screenshot-20180227145912.png

Dzisiaj udało mi się zapytaniem:

select AVG(Cast([9] as DECIMAL (9,2))) as Volume, ColorName as ColorNumber, TypName, IdRobot
from
(Select TColor.Name as ColorName, TType.Name as TypName, IdRobot, TimeStamp, IdSignal, Value, IdColor from TValue left join TValueSet on TValueSet.Id = TValue.IdValueSet left join TColor on TColor.Id = TValueSet.IdColor join TBody on TBody.Id = TValueSet.IdBody left join TType on TType.Id = TBody.IdType where IdRobot <> 1) as SourceTable
PIVOT
(MIN(Value) FOR IdSignal IN ([9])) as PivotTable
where TimeStamp > '2018-01-01 06:00:00' and TimeStamp < '2018-02-23 07:00:00' and TypName = 'T001'
group by IdColor,ColorName, TypName, IdRobot


Uzyskać wynik prawie dobry. Potrzebował bym tylko zrobić w jednej kolumnie wyniki dla różnego IdRobot.
Dzisiaj wygląda to tak:
screenshot-20180227151133.png
Jakieś pomysły?
Dzięki wielkie

0

Cos w ten deseń:

SELECT
	TypeName
	,ColorName
	,[1] AS [R1]
	,[2] AS [R2]
	,[3] AS [R3]
	,[4] AS [R4]
FROM (
	SELECT 
		,TType.Name AS TypName
		,TColor.Name AS ColorName
		,IdRobot
		,[VALUE]
	FROM 
		TValue 
		LEFT JOIN TValueSet ON TValueSet.Id = TValue.IdValueSet 
		LEFT JOIN TColor ON TColor.Id = TValueSet.IdColor 
		JOIN TBody ON TBody.Id = TValueSet.IdBody 
		LEFT JOIN TType ON TType.Id = TBody.IdType 
	WHERE 
		idSignal = 9
		AND TIMESTAMP > '2018-01-01 06:00:00' 
		AND TIMESTAMP < '2018-02-23 07:00:00' 
		AND TypName = 'T001') AS DANE
	PIVOT(
		AVG([VALUE]) 
		FOR IdRobot IN ([1],[2],[3],[4])
		) AS PVT
0

Dzięki wielkie.
Po drobnych przeróbkach wszystko zaczęło działać.
Problemem okazało się to że filtrowanie nie jest możliwe po TType.Name jako wartości ale po kolejnej wartości w tabeli IdValue.
Konkretnie Value dla IdSignal = 3
Kolejny zagnieżdżony select?

Pozdrawiam
Krzysztof

0

Tego zdania nie rozumiem:

Problemem okazało się to że filtrowanie nie jest możliwe po TType.Name jako wartości ale po kolejnej wartości w tabeli IdValue.

0

Cześć,
Teraz zapytanie jest skonstruowane tak że jest warunkowane wartością TypName

AND TypName = 'T001'

A muszę je filtrować po numerze typu, który to jest kolejną wartością w tabeli TValue
Konkretnie TValue.IdSignal = 3 - dla tego numeru sygnału wartość TValue.Value mówi o numerze typu.
To po tej wartości chciał bym filtrować wyniki.

Pozdrawiam

0

Byłoby prościej gdybyś w opisie tego co chcesz wyciągnąć nie operował opisem kolumn a ich faktycznymi nazwami, bo ja nie wiem co masz na myśli pisząc numer typu.
Pokazałeś że TValue ma 3 kolumny IdValueSet, idSignal, TValue to która to jest ten numer typu, bo TType ma id, numeru nie widzę.
Może prościej będzie jak zrobisz jakiś przykładowy zestaw danych na sqlfiddle.com, bo piszesz też że zmodyfikowałeś zapytanie, ale nie pokazałeś jak, a mam wrażenie, ze do niego się odnosisz.
dodatkowo sformułowanie który to jest kolejną wartością w tabeli TValue nie wiele mowi, bo nie wiem czy chodzi o dodatkową kolumnę w tabeli, czy kolejny rekord, a jeśli kolejny to co determinuje kolejność.
Mimo chęci nie jestem w stanie pojąć Twojego przekazu.

0

Cześć,
Dane są zadeklarowane tak że w do tabeli TValue deklarowane jest wiele sygnałów wraz z ich wartościami dla jednego Id.
Typ jest tam reprezentowany jako wartość Value dla IdSignal = 3
Podobnie jak jest w przypadku poszczególnych robotów R1 Value pobieramy dla IdSignal = 9
Przykładowa paczka danych znajduje się:

http://sqlfiddle.com/#!18/e36a9
Tabela ma wyglądać jak coś takiego (sorry za screen ale tak było najprościej)
screenshot-20180301143152.png

Mam nadzieję że teraz jest wszystko OK.
Zapytanie którego teraz używam jest warunkowane po wartościach TType.Name gdzie niestety są przechowywane wartości, które mnie nie satysfakcjonują jako opis typu (Trochę pogmatfana ta DB).

Pozdrawiam

0

Brakuje tabel tBody i TType w tym fiddle.
Nie rozumiem tej kolumny typ, co znaczy zapis TValue.Value idSignal= 3, bo w TValue nie ma takiej wartości?

0

Cześć,
Nie tabele TBody i TType nie są już potrzebne. Join na nich był ustawiony tylko dla wyciągnięcia wartości TType.Name, która już nie jest dostepna i zamiast niej chciał bym wyciągać dane z tabel TValue.

Nie rozumiem tej kolumny typ, co znaczy zapis TValue.Value idSignal= 3, bo w TValue nie ma takiej wartości?>

Dane do tabeli wpływają w sposób taki że dla jednego IdValueSet jest przypisane kilka sygnałów (IdSignal) i każdy z nich ma swoją wartość.
Numer typu, który chcę wyciągnąć znajduje się w tabeli TValue.Value dla IdSignal =3.
Wartość, z której chcę wyciągnąć średnią znajduje się w TValue.Value dla IdSignal = 9 etc.

0

Tylko trochę ciężko testować na zestawie który dałeś, bo tam nie ma idSignal=3, trochę je pozmieniałem i wyszło cos takiego:

with IS9 as (
  SELECT 
        IdRobot
        ,convert(numeric(18,2),[VALUE]) [VALUE]
        ,TColor.Name Color
    FROM 
        TValue 
        LEFT JOIN TValueSet ON TValueSet.Id = TValue.IdValueSet 
        LEFT JOIN TColor ON TColor.Id = TValueSet.IdColor  
      WHERE 
        idSignal = 9       
), IS3 as (
  SELECT 
    IdRobot
    ,[VALUE] Typ
  FROM 
    TValue 
    LEFT JOIN TValueSet ON TValueSet.Id = TValue.IdValueSet 
  WHERE 
    idSignal = 3    
)
select
    typ TypeName
    ,color ColorName
    ,[1] AS [R1]
    ,[2] AS [R2]
    ,[3] AS [R3]
    ,[4] AS [R4]
    ,[5] AS [R5]
FROM (
    select 
        typ
        ,Color
        ,is3.IDRobot
        ,value
    from 
      is3
      left join is9 on is3.idRobot = is9.IdRobot) as dane
      PIVOT(
        AVG([VALUE]) 
        FOR IdRobot IN ([1],[2],[3],[4],[5])
        ) AS PVT      

http://sqlfiddle.com/#!18/e9a79/5/0

Nadal jednak nie mogę zrozumieć jak przpisać odpowiednie wartości dla sygnału 9 do sygnału 3, łącze się po IDRobot...

1 użytkowników online, w tym zalogowanych: 0, gości: 1