Dwa kryteria sortowania w jednej tabeli

0

Cześć,
Tworząc własny projekt w C# łącze się z baża danych MS SQL, pobieram dane, sortuję i wyświetlam na różne sposoby.
Wszystkie dane wyświetlam w dataGridView1:

 public partial class Form5 : Form
    {
        SqlConnection con;
        public Form5()
        {
            InitializeComponent();
            con = new SqlConnection(" server=TMS; initial catalog=TMSCLIENT4; user = sa ; password = ptms ");
        }
        
        private void button1_Click(object sender, EventArgs e)
        {
           try
            {
                con.Open();
                 SqlDataAdapter sqlData = new SqlDataAdapter
                ("SELECT DATEADD(DAY, DATEDIFF(DAY, 0, WorkDateTime), 0) as Dzień,  'DZIEŃ' AS Okres,SUM(Weight) AS Produkcja, AVG(Performance) AS Wydajność, COUNT(BeltMoveTime) AS 'Czas_ruchu_taśmy' FROM[TMSCLIENT4].[dbo].[vwConveyorScaleMinute] WHERE VehicleId = 2 AND WorkDateTime BETWEEN '2021-09-16 01:00:00.000'AND '2021-09-30 23:00:00.000' AND BeltMoveTime = 1 GROUP BY dateadd(DAY, datediff(DAY, 0, WorkDateTime), 0)ORDER BY dateadd(DAY, datediff(DAY, 0, WorkDateTime), 0)", con);
                DataTable dtbl = new DataTable();
                sqlData.Fill(dtbl);
                dataGridView1.DataSource = dtbl;
               con.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
}
}

i wszytsko łądnie działa.
Prolbem pojawił się w chwili gdy chcę dodac jedną kolumne w której będą inne parametry sortowania. (dane będa te same lecz sortowane pod całkowicie innymi kryteriami )
Próbowałem dodać nowa kolumnę w dataGridView1 i tam zaimportowac od nowa dane z bazy posortowane według innych kryteriów, lecz nie wyszło mi to.

Dlatego pytam czy to wogólę dobra droga ? aby importować dane do data|GridView1 dwa razy czy jest na to inne rozwiązanie ?

0

A możesz napisać co masz w kolumnie a po czym chcesz sortować ?

0

Dane w bazie są zbierane co 1 min. poniżej mamy juz tabelkę z posortowanymi danymi
screenshot-20211123113514.png
gdzie np.
Mamy "Czas_ruchu_taśmy" liczony tylko gdy "Wydajność " jest wieksza od 10 używając
COUNT(BeltMoveTime) AS 'Czas_ruchu_taśmy'
AND Performance >10

Teraz chcę stworzyć nową kolumne o nazwie "Czas_ponieżej_wydajności" w dataGridView1 i tam sortowac dane z bazy według kryteeriun np. Performance <10 i Performance >0. Oczywiście chcę dodać kilka column z różnymi Kryteriami sortowania, wszytsko opiera się na jednej tabeli i tych samych danych.

1

Nie do końca rozumiem, ale wydaje mi się ze chodzi o coś takiego

sum(CASE
    WHEN Performance  < 10 THEN  BeltMoveTime
       ELSE 0
END) as Czas_ponieżej_wydajności;

Maszyna nie może mieć wydajności poniżej zera, bo by musiała produkty zażerać.

0

Już tłumaczę:
Zazwyczaj mamy sytuację :
screenshot-20211124075038.png

mamy jasny sygnał ze maszyna pracuję, wskazuje to BeltMoveTime i wszystkie zapytania i wyliczenia ładnie działają.
Problem pojawia sie gdy mamy przypadek :

screenshot-20211124075306.png

Ta stacja miała miejsce w dzień wolny od pracy, i mamy informację, że w ciągu całego dnia przez 1 min było jakieś zakłócenie i w danych 1 na jednej pozycji.
w takiej sytuacji wszystkie zapytania pokażą w ten dzień 0, lecz chodzi mi o to by w ogóle nie zakwalifikowało tego dnia i automatycznie odrzuciło takie zakłócenia, dlatego wspomniałem o tym kryterium, jeśli nie mamy przynajmniej 5 jedynek pod rząd (czyli ciągłej pracy 5 min) nie bierzemy tego w ogóle pod uwagę i tym samym taki dzień nie będzie uwzględniany podczas sortowania.
Czy możliwe jest dodanie jakieś funkcji warunkowej aby sprawdzać takie rzeczy i eliminować takie zakłócenia?

Mam nadzieję, że już jasno wytłumaczyłem o co mi chodzi

1
Mlody_pb napisał(a):

Już tłumaczę:

Zazwyczaj mamy sytuację :
screenshot-20211124075038.png

mamy jasny sygnał ze maszyna pracuję, wskazuje to BeltMoveTime i wszystkie zapytania i wyliczenia ładnie działają.
Problem pojawia sie gdy mamy przypadek :

screenshot-20211124075306.png

Ta stacja miała miejsce w dzień wolny od pracy, i mamy informację, że w ciągu całego dnia przez 1 min było jakieś zakłócenie i w danych 1 na jednej pozycji.
w takiej sytuacji wszystkie zapytania pokażą w ten dzień 0, lecz chodzi mi o to by w ogóle nie zakwalifikowało tego dnia i automatycznie odrzuciło takie zakłócenia, dlatego wspomniałem o tym kryterium, jeśli nie mamy przynajmniej 5 jedynek pod rząd (czyli ciągłej pracy 5 min) nie bierzemy tego w ogóle pod uwagę i tym samym taki dzień nie będzie uwzględniany podczas sortowania.
Czy możliwe jest dodanie jakieś funkcji warunkowej aby sprawdzać takie rzeczy i eliminować takie zakłócenia?

Mam nadzieję, że już jasno wytłumaczyłem o co mi chodzi

Rozwiązanie tego problemu nie jest na jednego SQLa:

  1. Metody statystyczne - sprawdzasz że to była jedna (najważniejsze jest określenie warunków, przy jakich ignorujesz odczyty) i ignorujesz takie wpisy
  2. Stworzenie planu zmian o określenie, kiedy są pracujące, a kiedy nie i ignorowanie kiedy zmiany są niepracujące.
  3. Powiązanie danych z maszyny ze zleceniami produkcyjnymi (jak takie są) - ignorować dane z maszyny ja nie mam niej uruchomionego zlecenia.

Można też wykorzystać wszystkie 3 metody.

0

Technicznie, gdyż już jakiś czas myślę nad tym i nic nie wychodzi. Próbowałem właśnie to zrobić już w programie w C# ale nie wyszło. Teraz właśnie podsunąłeś inny pomysł, lecz kompletnie nie wiem jak go ugryść.
Z założeniem że jeśli pojawi się czas pracy poniżej 5 min (ewenutalnie później do zmiany) to odrzucamy te dane i w późniejszym sortowaniu ich nie uwzględniamy., aby nie było sytuacja ja na obrazku:

screenshot-20211124134554.png

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