2010-07-21 4 views
1

Ok, j'ai une sous-requête avec laquelle j'essaie de travailler et qui nécessitait une réponse à une question compliquée. Un outil SQL est utilisé pour générer des rapports. Avec cet outil, vous pouvez sélectionner des dates tant que la date est dans l'instruction select externe. Ainsi, vous pouvez utiliser cet outil pour sélectionner une plage de dates, par exemple, à partir d'une simple déclaration de sélection comme ceci:Date MySQL entre sous-requêtes Question

select date_entered, name from opportunities 

Cela fonctionne très bien avec l'outil.

Cependant, j'ai une exigence SQL où j'ai besoin que chaque colonne soit sa propre instruction SQL (essentiellement, une série de sous-requêtes). Ma question est - y at-il de toute façon qu'une sous-requête utilise la date de la sélection initiale? Voici un exemple d'une instruction select que j'ai à faire:

SELECT 
(
    SELECT 
     count(
      opportunities.id) AS "count_for_opp_id" 

    FROM 
     opportunities 
LEFT JOIN opportunities_cstm ON opportunities.id = opportunities_cstm.id_c 
WHERE 
    opportunities.deleted = '0' 
AND ((curdate() - interval 0 day) <= opportunities.date_entered) 
AND opportunities_cstm.lead_category_c = 'GM Internet' 
AND opportunities_cstm.lead_type_c = 'Sales' 
AND opportunities_cstm.partner_id_c LIKE '41%' 
OR opportunities_cstm.partner_id_c LIKE '42%' 
OR opportunities_cstm.partner_id_c LIKE '43%' 
OR opportunities_cstm.partner_id_c LIKE '44%' 
OR opportunities_cstm.partner_id_c LIKE '45%' 
OR opportunities_cstm.partner_id_c LIKE '47%' 
OR opportunities_cstm.partner_id_c LIKE '48%' 
OR opportunities_cstm.partner_id_c LIKE '49%' 
OR opportunities_cstm.lead_sub_type_c = 'GM 3rd Party' 
)AS TOT_DIV_THIRD_PARTY_SALES_LEADS, 
(
SELECT 
count(opportunities.id) AS "count_for_opp_id" 
FROM 
opportunities left 
    JOIN opportunities_cstm ON opportunities.id = opportunities_cstm.id_c 
WHERE 
    opportunities.deleted = '0' 
AND ((curdate() - interval 0 day) <= opportunities.date_entered) 
AND opportunities_cstm.lead_category_c = 'Dealer Web' 
AND opportunities_cstm.lead_type_c = 'Sales' 
AND opportunities_cstm.lead_sub_type_c = 'GM Dealer Website' 
OR opportunities_cstm.lead_sub_type_c = 'DMA Landing Page' 
)AS TOT_DEALER_WEBSITE_DMA_SALES_LEADS, 
(
    SELECT 
     count(opportunities.id) AS "count_for_opp_id" 
    FROM 
     opportunities left 
    JOIN opportunities_cstm ON opportunities.id = opportunities_cstm.id_c 
JOIN leads_handling_objectives 
WHERE 
opportunities.deleted = '0' 
AND ((curdate() - interval 0 day) <= opportunities.date_entered) 
AND opportunities_cstm.lead_category_c = 'GM Internet' 
AND opportunities_cstm.partner_id_c LIKE '41%' 
OR opportunities_cstm.partner_id_c LIKE '42%' 
OR opportunities_cstm.partner_id_c LIKE '43%' 
OR opportunities_cstm.partner_id_c LIKE '44%' 
OR opportunities_cstm.partner_id_c LIKE '45%' 
OR opportunities_cstm.partner_id_c LIKE '47%' 
OR opportunities_cstm.partner_id_c LIKE '48%' 
OR opportunities_cstm.partner_id_c LIKE '49%' 
OR opportunities_cstm.lead_sub_type_c = 'GM 3rd Party' 
AND opportunities_cstm.time_followup_c <= leads_handling_objectives.resp_time_obj 
AND opportunities_cstm.make_c = leads_handling_objectives.makes_carried 
AND opportunities_cstm.time_followup_c IS NOT NULL 
)AS NUM_OF_LEADS_RESP_ONTIME_DIVISIONAL_THIRD_PARTY, 
(
    SELECT 
     count(opportunities.id) AS "count_for_opp_id" 
    FROM 
     opportunities left 
    JOIN opportunities_cstm ON opportunities.id = opportunities_cstm.id_c 
JOIN leads_handling_objectives 
WHERE 
opportunities.deleted = '0' 
AND ((curdate() - interval 0 day) <= opportunities.date_entered) 
AND opportunities_cstm.lead_category_c = 'Dealer Web' 
AND opportunities_cstm.lead_sub_type_c = 'GM Dealer Website' 
OR opportunities_cstm.lead_sub_type_c = 'DMA Landing Page' 
AND opportunities_cstm.time_followup_c <= leads_handling_objectives.resp_time_obj 
AND opportunities_cstm.make_c = leads_handling_objectives.makes_carried 
AND opportunities_cstm.time_followup_c IS NOT NULL 
)AS NUM_OF_LEADS_RESP_ONTIME_DEALERWEBSITE_DMA 

Si vous regardez cette requête, vous remarquerez la curdate ... < = partie date_entered de la sous-requête. Je dois vraiment avoir ceci sur la couche externe en quelque sorte de l'instruction select. Cependant, si je mets ceci sur la couche externe, je ne suis pas sûr de savoir comment faire en sorte que la sous-requête utilise la plage de dates de cette façon. Je sais que c'est une question compliquée mais - y aurait-il des conseils de tous ceux qui sont là-bas? Merci!

(note:.. En outre, cela ne peut pas être une procédure ou une fonction Il doit être une instruction select ou une vue de travailler avec l'outil de reporting)

un plus modifier - un extrait plus facile (plus petit) de SQL ci-dessus peut se concentrer ici:

SELECT 
(SELECT 
     count(
      opportunities.id) AS "count_for_opp_id" 

    FROM 
     opportunities 
LEFT JOIN opportunities_cstm ON opportunities.id = opportunities_cstm.id_c 
WHERE 
    opportunities.deleted = '0' 
AND ((curdate() - interval 0 day) <= opportunities.date_entered) 
AND opportunities_cstm.lead_category_c = 'GM Internet' 
AND opportunities_cstm.lead_type_c = 'Sales' 
) AS TOT_DIV_THIRD_PARTY_SALES_LEADS 

celui-ci pourrait être ci-dessus plus facile à lire et plus facile à diagnostiquer à long terme.

Merci!

+1

Holy shiz ... = O – NullUserException

+0

Pourquoi avez-vous tous ces _utf8 partout? N'est-il pas plus facile de définir correctement les paramètres de classement? – NullUserException

+0

Il n'y a aucun moyen de corriger tout cela, mais ** s'il vous plaît ** savoir quand utiliser les crochets. C'est trop verbeux, ce qui ne rendra pas l'aide facile. Et c'est un cauchemar à maintenir - une parenthèse incorrecte ne vous donnera pas une erreur de syntaxe. –

Répondre

1

Votre requête (plus petite) en l'état manque de FROM. Mettre un en vous donnera un crochet pour accrocher le curdate() fonction de ...

SELECT (SELECT count(opportunities.id) AS "count_for_opp_id" 
      FROM opportunities LEFT JOIN opportunities_cstm ON opportunities.id = opportunities_cstm.id_c 
      WHERE opportunities.deleted    = '0' AND 
        ((curdate() - interval 0 day)  <= opportunities.date_entered) AND 
        opportunities_cstm.lead_category_c = 'GM Internet' AND 
        opportunities_cstm.lead_type_c  = 'Sales') AS TOT_DIV_THIRD_PARTY_SALES_LEADS 
    FROM any_table 
    LIMIT 1; 

suggestion ... Deuxième

SELECT <given date>, 
     (SELECT count(opportunities.id) AS "count_for_opp_id" 
      FROM opportunities LEFT JOIN opportunities_cstm ON opportunities.id = opportunities_cstm.id_c 
      WHERE opportunities.deleted    = '0' AND 
        (<given date>      <= opportunities.date_entered AND 
        opportunities_cstm.lead_category_c = 'GM Internet' AND 
        opportunities_cstm.lead_type_c  = 'Sales') AS TOT_DIV_THIRD_PARTY_SALES_LEADS 
    FROM any_table 
    LIMIT 1; 

La date donnée peut être un littéral ou une variable ou il pourrait être présent dans any_table; ça marchera très bien dans la sous-requête.

+0

Merci pour vos commentaires. Malheureusement, cela ne fonctionnerait pas pour le curdate puisque la sous-requête serait toujours limitée au curdate dans la sous-requête. Je suis besoin fondamentalement quelque chose comme ceci: sélectionnez (sélectionnez compte ... des opportunités où opportunities.date_entered <= ) comme TOTAL_COUNT des opportunités – swhitlow

+0

j'ai fait une deuxième suggestion, mais je Je ne suis toujours pas sûr de la difficulté. La date n'a pas besoin d'être sélectionnée dans la sous-requête pour être disponible. –