70 messaggi dal 06 gennaio 2019
Buongiorno a tutti e grazie in anticipo per l'aiuto che vorrete darmi.
Ho due tabelle del seguente tipo:
TbLocaliInUso
|id|idDistanza|InUso|Pre|
|1 |9         |0    |1  | 
|2 |9         |1    |0  | 
|3 |9         |0    |0  |
|4 |7         |0    |1  |
|5 |8         |1    |0  |


TbLocaliDistanze
|id|IdReparto |Nfascia|NCamera|
|7 |2         |3      |3      | 
|8 |2         |3      |3      | 
|9 |2         |3      |2      |
|10|2         |3      |5      | 
|11|2         |3      |2      | 
|12|2         |3      |2      |


TbLocaliInUso.idDistanza è la chiave esterna di TbLocaliDistanze.id

devo riuscire ad ottenere una vista che sia il risultato della differenza dei dati tenendo conto c he nella tabella TbLocaliInUso sono indicati i locali in uso e che non possono essere riutilizzati a meno che i valori dei campi inUso e Pre non siano entrambi 0.
Non si potrà mai verificare che entrambi i campi siano a 1.
il Risultato dovrebbe essere questo:

VistaLocaliUtilizzabili
|id|IdReparto |Nfascia|NCamera|
|7 |2         |3      |2      | 
|8 |2         |3      |2      | 
|9 |2         |3      |0      |
|10|2         |3      |5      | 
|11|2         |3      |2      | 
|12|2         |3      |2      |

Sinceramente non so come fare ad ottenere il risultato che desidero.
Nella speranza di essere stato sufficientemente chiaro, chiedo a qualcuno di fornirmi qualche indicazione, su come risolvere il quesito? Grazie mille!
1.946 messaggi dal 27 luglio 2005
Contributi
salve,
non riesco a capire, tanto piu' che non mi sembra di vedere una relazione tra le tabelle in base ai dati ed al risultato che hai indicato...
potresti per favore approfondire la relazione?
salutoni omnia

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
70 messaggi dal 06 gennaio 2019
Grazie mille Andrea per avermi letto.

La relazione fra le due tabelle è:

TbLocaliInUso.idDistanza

e

TbLocaliDistanze.id

In buona sostanza le due tabelle sono messe in relazione da idDistanza E id

spero di essere stato chiaro.
grazie mille
299 messaggi dal 13 luglio 2005
Ciao shadow76, cosi' dovrebbe funzionare:

SELECT
  id, IdReparto, Nfascia,
  NCamera - ISNULL((SELECT (SUM(InUso) + SUM(Pre)) FROM TbLocaliInUso AS LU WHERE LU.idDistanza = LD.id GROUP BY LU.idDistanza), 0) AS NCamera
FROM
  TbLocaliDistanze AS LD


fammi sapere se e' quello che volevi ottenere.

Ciao

Umb
1.946 messaggi dal 27 luglio 2005
Contributi
salve a tutti,
Umberto ha raggiunto il risultato, ma personalmente NON amo molto le subquery innestate, al di la' che i piani di esecuzione mostratimi con questo ridottissimo campione siano tecnicamente i medesimi e quindi senza differenze in performance anche nel caso di un'aggregazione estrapolata diversamente...
preferisco infatti (ripeto, a prescindere che quanto Umberto abbia indicato possa essere corretto in base a quanto richiesto), una soluzione con una Common Table Expression, similarmente a
WITH cteTbLocaliInUso AS (
  SELECT ti.[IdDistanza]
    , SUM( ti.[InUso] ) + SUM( ti.[Pre] ) AS [nr]
    FROM [dbo].[TbLocaliInUso] ti
    GROUP BY ti.[IdDistanza]
  )
SELECT td.[Id], td.[IdReparto], td.[NFascia]
  , td.[NCamera] - ISNULL( ti.[nr], 0 ) AS [NCamera] 
  FROM [dbo].[TbLocaliDistanze] td
    LEFT JOIN cteTbLocaliInUso ti ON ti.[IdDistanza] = td.[Id];

--<---------
Id          IdReparto   NFascia     NCamera
----------- ----------- ----------- -----------
7           2           3           2
8           2           3           2
9           2           3           0
10          2           3           5
11          2           3           2
12          2           3           2



continuo a vedere una "mancanza di relazione" (in base ai dati presentati, che magari saranno sicuramente parziali) tra TbLocaliInUso e TbLocaliDistanze in quanto NON posso pensare ci possa essere un assenza di vincolo referenziale e quindi richiedere un OUTER join e non un INNER join, ma tant'e'... forse non ho ben compreso la modellazione della tua realta' :D
salutoni omnia

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
70 messaggi dal 06 gennaio 2019
Grazie mille, avete centrato la soluzione alla mia richiesta. Provato e funzione alla grande.
Ma se volessi aggiungere una chiave primaria alla vista? Ho provato a definire id con primary key ma non mi funziona.
1.946 messaggi dal 27 luglio 2005
Contributi
salve a tutti,
shadow76 ha scritto:
Grazie mille, avete centrato la soluzione alla mia richiesta. Provato e funzione alla grande.
Ma se volessi aggiungere una chiave primaria alla vista? Ho provato a definire id con primary key ma non mi funziona.


credo proprio di non aver compreso la domanda... anche perche', come ben sai, non si possono definire primary keys sulle viste, ma solo su tabelle... SQL Server supporta le "viste indicizzate" ( https://docs.microsoft.com/it-it/sql/relational-databases/views/create-indexed-views?view=sql-server-ver15 ), che tecnicamente vengono implementate persistendo il resultset derivante dall'esecuzione del comando della vista e gestendo indici come "desiderato", ma non si parla di primary keys...

puoi per favore approfondire la tua richiesta?
salutoni omnia

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
70 messaggi dal 06 gennaio 2019
Andrea Montanari ha scritto:
salve a tutti,
shadow76 ha scritto:
Grazie mille, avete centrato la soluzione alla mia richiesta. Provato e funzione alla grande.
Ma se volessi aggiungere una chiave primaria alla vista? Ho provato a definire id con primary key ma non mi funziona.


credo proprio di non aver compreso la domanda... anche perche', come ben sai, non si possono definire primary keys sulle viste, ma solo su tabelle... SQL Server supporta le "viste indicizzate" ( https://docs.microsoft.com/it-it/sql/relational-databases/views/create-indexed-views?view=sql-server-ver15 ), che tecnicamente vengono implementate persistendo il resultset derivante dall'esecuzione del comando della vista e gestendo indici come "desiderato", ma non si parla di primary keys...

puoi per favore approfondire la tua richiesta?
salutoni omnia


Grazie mille Omnia,
come al solito hai centrato il "problema"! Volevo chiedere come fare a indicizzare una vista.
Leggerò il link che hai postato che sicuramente sarà esauriente.
Grazie ancora
Modificato da shadow76 il 11 febbraio 2020 12:10 -

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.