SQL - reducir este query a menos lineas

 
Vista:
Imágen de perfil de ivette

reducir este query a menos lineas

Publicado por ivette (8 intervenciones) el 04/05/2014 11:09:57
Hola

por favor me pueden ayudar, ¿como puedo hacer este query mas corto, es decir de mejor forma, si me funciona pero la manera en que lo hice se que no es buena


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
SELECT
[FechadeTransmision]
,[FechaTrans]
,[Canal]
,[Programa]
,[Duración Spot]
,[Rating]
,[Tarifa]
,[FranjaComercial]
,[GeneroPrograma]
,DATEPART(HOUR,[FechaTrans]) as [Hora fecha trans]
,DATEPART(DAY,[FechaTrans]) as [Dia fecha trans]
,DATEPART(MONTH,[FechaTrans]) as [Mes fecha trans]
,[Registros por hora]
,[rating por hora] as[sum rating por hora]
,([rating]*100) as ratingpor100
,([rating]*100/[rating por hora]/100) as[% distribucion]
,(([rating]*100/[rating por hora]/100) )*[Registros por hora] as [Registros distribiudos]
 
 ----- APLICAR LOS 5 MINUTOS A LA FECHA DE TRASMISION columna key
FROM
    (
 
	SELECT
	      CASE  WHEN DATEPART(mi,FechadeTransmision) >= 55 THEN DATEADD(mi,5,FechadeTransmision)
          ELSE FechadeTransmision END AS [FechaTrans]
 
	      ,CASE WHEN DATEPART(mi,FechadeTransmision) >= 55
		      THEN
		          CONCAT(DATEPART (day,DATEADD(mi,5,FechadeTransmision))
                   ,'_' ,DATEPART (month,DATEADD(mi,5,FechadeTransmision))
                   ,'_',DATEPART (year,DATEADD(mi,5,FechadeTransmision))
                   ,'_',DATEPART (hour, DATEADD(mi,5,FechadeTransmision)))
              ELSE CONCAT(DATEPART (day,FechadeTransmision)
                  ,'_' ,DATEPART (month,FechadeTransmision)
                  ,'_',DATEPART (year,FechadeTransmision)
                  ,'_',DATEPART (hour, FechadeTransmision)) END AS [key]
                ,[FechadeTransmision]
				,[Canal]
                ,[Programa]
                ,[Duración Spot]
                ,[Rating]
                ,[Tarifa]
                ,[FranjaComercial]
                ,[GeneroPrograma]
	   FROM [MXDatamart].[dbo].[tb_MXTVReport_MOET]
            where Canal not like '%DISH%'
 
)  tv
 
left JOIN
 
 
-----Agrupa los Registros por  key, column name: [Registros por hora]
 
(
 
 
select
 
COUNT(Salesforce_id) AS [Registros por hora]
                  ,CONCAT(DATEPART (day,DATEADD(hour,-6,[CreatedDate]))
                   ,'_' ,DATEPART (month,DATEADD(hour,-6,[CreatedDate]))
                   ,'_',DATEPART (year,DATEADD(hour,-6,[CreatedDate]))
                   ,'_',DATEPART (hour, DATEADD(hour,-6,[CreatedDate]))) as [key]
FROM [BUDatamartSource].[dbo].[Salesforce_Lead](nolock)
WHERE RecordTypeId =  '012400000009A2xAAE'
      and  DATEADD(hh,-6,[CreatedDate]) between '2014-01-14 00:00:00.000' and getdate()
 
GROUP BY
                  CONCAT(DATEPART (day,DATEADD(hour,-6,[CreatedDate]))
                   ,'_' ,DATEPART (month,DATEADD(hour,-6,[CreatedDate]))
                   ,'_',DATEPART (year,DATEADD(hour,-6,[CreatedDate]))
                   ,'_',DATEPART (hour, DATEADD(hour,-6,[CreatedDate])))
 
 
 
) AS Registros
 
 
 
ON tv.[key] = Registros.[key]
 
 
left JOIN
 
 
--- agrupa la suma de ratings  por hora  column name: [rating por hora]
(
 
SELECT
sum(Rating) as [rating por hora]
,     CASE WHEN DATEPART(mi,FechadeTransmision) >= 55
		      THEN
		          CONCAT(DATEPART (day,FechadeTransmision)
                   ,'_' ,DATEPART (month,DATEADD(mi,5,FechadeTransmision))
                   ,'_',DATEPART (year,DATEADD(mi,5,FechadeTransmision))
                   ,'_',DATEPART (hour, DATEADD(mi,5,FechadeTransmision)))
              ELSE CONCAT(DATEPART (day,FechadeTransmision)
                  ,'_' ,DATEPART (month,FechadeTransmision)
                  ,'_',DATEPART (year,FechadeTransmision)
                  ,'_',DATEPART (hour, FechadeTransmision)) END AS [key]
 
FROM [MXDatamart].[dbo].[tb_MXTVReport_MOET]
where Canal not like '%DISH%'
group by
      CASE WHEN DATEPART(mi,FechadeTransmision) >= 55
		      THEN
		          CONCAT(DATEPART (day,FechadeTransmision)
                   ,'_' ,DATEPART (month,DATEADD(mi,5,FechadeTransmision))
                   ,'_',DATEPART (year,DATEADD(mi,5,FechadeTransmision))
                   ,'_',DATEPART (hour, DATEADD(mi,5,FechadeTransmision)))
              ELSE CONCAT(DATEPART (day,FechadeTransmision)
                  ,'_' ,DATEPART (month,FechadeTransmision)
                  ,'_',DATEPART (year,FechadeTransmision)
                  ,'_',DATEPART (hour, FechadeTransmision)) END
 
 
 
) as ratings
 
on tv.[key]=ratings.[key]
 
left JOIN
 
 
----multiplica y agrupa  el rating por 100 para calculo de formula de prorateo  column name:[rating*100]
 
(
 
SELECT
((Rating)*100) as[rating*100]
,     CASE WHEN DATEPART(mi,FechadeTransmision) >= 55
		      THEN
		          CONCAT(DATEPART (day,FechadeTransmision)
                   ,'_' ,DATEPART (month,DATEADD(mi,5,FechadeTransmision))
                   ,'_',DATEPART (year,DATEADD(mi,5,FechadeTransmision))
                   ,'_',DATEPART (hour, DATEADD(mi,5,FechadeTransmision)))
              ELSE CONCAT(DATEPART (day,FechadeTransmision)
                  ,'_' ,DATEPART (month,FechadeTransmision)
                  ,'_',DATEPART (year,FechadeTransmision)
                  ,'_',DATEPART (hour, FechadeTransmision)) END AS [key]
 
FROM [MXDatamart].[dbo].[tb_MXTVReport_MOET]
where Canal not like '%DISH%'
group by
      CASE WHEN DATEPART(mi,FechadeTransmision) >= 55
		      THEN
		          CONCAT(DATEPART (day,FechadeTransmision)
                   ,'_' ,DATEPART (month,DATEADD(mi,5,FechadeTransmision))
                   ,'_',DATEPART (year,DATEADD(mi,5,FechadeTransmision))
                   ,'_',DATEPART (hour, DATEADD(mi,5,FechadeTransmision)))
              ELSE CONCAT(DATEPART (day,FechadeTransmision)
                  ,'_' ,DATEPART (month,FechadeTransmision)
                  ,'_',DATEPART (year,FechadeTransmision)
                  ,'_',DATEPART (hour, FechadeTransmision)) END
				  ,((Rating)*100)
 
 
) AS [RATING2]
 
 
on tv.[key]=[RATING2].[key]
 
 
group by
[FechadeTransmision]
,[FechaTrans]
,[Canal]
,[Programa]
,[Duración Spot]
,[Rating]
,[Tarifa]
,[FranjaComercial]
,[GeneroPrograma]
,DATEPART(HOUR,[FechaTrans])
,DATEPART(DAY,[FechaTrans])
,DATEPART(MONTH,[FechaTrans])
,[Registros por hora]
,[rating por hora]
,([rating]*100)
 
,([rating]*100/[rating por hora]/100)
 
order by [FechaTrans] asc
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

reducir este query a menos lineas

Publicado por leonardo_josue (1173 intervenciones) el 06/05/2014 17:48:57
Hola ivette:

Tratar de entender qué es lo que hiciste con una consulta tan larga resulta casi imposible :S y por lo tanto, decirte cómo puedes simplificar la consulta resulta también bastante complicado.

De entrada me parece debes comenzar por decirnos cuál es la estructura de tus tablas (veo que utilizas al menos dos: [MXDatamart].[dbo].[tb_MXTVReport_MOET] y [BUDatamartSource].[dbo].[Salesforce_Lead])

También es conveniente que nos pongas algunos datos de ejemplo y a partir de esos datos nos digas qué es lo que esperas como resultado.

de esta manera será más factible poder decirte alguna manera para llegar al mismo resultado.

No lo mencionas en tu post, pero supongo que estás trabajando con SQL Server (faltaría que nos digas con qué versión - edición). Esto es muy importante porque hay diferencias considerables entre los distintos DBMS.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar