2009-12-11 9 views
0

alt text http://i46.tinypic.com/23lgoy8.jpg Comment puis-je écrire une requête pour cela? Je ne suis pas un expert pour écrire autant de requêtes complexes en SQL. J'ai oublié de mentionner l'offre 3, 4 iciBesoin d'aide pour écrire une requête SQL

Merci, Jestges

+0

De quelles valeurs avez-vous besoin dans les colonnes 'checkin' et 'checkout'? Essayez d'utiliser une clause GROUP BY pour la colonne "enchère". – Dor

+0

Pourquoi la caisse de l'offre 6 aide 12 au lieu de 13? –

+1

S'il vous plaît donner plus d'informations afin que les gens peuvent vous aider. Quelles ** règles ** sont utilisées pour former votre résultat d'échantillon? Si vous "avez oublié de mentionner l'enchère 3, 4", éditez votre question pour les montrer! En l'état, votre question est tellement vague que toute réponse donnée sera purement une conjecture. Sans mentionner que vous pouvez obtenir une réponse qui a l'air juste, mais ne correspond pas vraiment à l'exigence. Si ** vous ** ne comprenez pas suffisamment l'exigence pour l'expliquer, comment allez-vous confirmer si une réponse donnée est correcte? S'il vous plait, réparez votre question, ou cela pourrait aussi bien être marqué, car actuellement c'est inutile! –

Répondre

2
SELECT 
    a.bid, a.time checkin, ISNULL(b.time, '') checkout 
FROM 
    myTable a 
LEFT JOIN 
    myTable b ON a.bid = b.bid AND b.type = 'Check Out' 
WHERE 
    a.type = 'Check In' 
ORDER BY 
    a.time 

EDIT

En réponse à votre commentaire, car il y a plusieurs dossiers du même bid et vous voulez seulement un enregistrement par bid dans votre sortie, vous devez spécifier quels enregistrements vous voulez dans votre sortie. Quand il y en a plus d'un, comment décidez-vous quelle valeur choisir? Si vous voulez toujours plus tôt checkin et la dernière commande, vous pouvez faire quelque chose comme ceci:

SELECT 
    a.bid, 
    MIN(a.time) checkin, 
    ISNULL((SELECT 
       MAX(time) 
      FROM 
       myTable 
      WHERE 
       bid = a.bid 
       AND type = 'Check Out'), '') checkout 
FROM 
    myTable a 
WHERE 
    a.type = 'Check In' 
GROUP BY 
    a.bid 

Si ce n'est pas exactement ce que vous voulez; ajuster l'utilisation de MIN et MAX pour répondre à vos besoins.

+0

Bonjour David merci pour votre réponse rapide. Mais quand j'essaie d'exécuter la requête, je reçois des lignes répétitives. Mais je n'ai besoin que d'une ligne par jour (Means datetime) – Nagu

+0

Je pense qu'il vous manque toujours le minimum/maximum de temps et un groupe par a.bid pour éliminer les cas comme bid = 6 ayant deux check ins –

+0

@fd: avez-vous écrit cela avant ou après ma modification? il y a une clause de groupe, maintenant ... @nagu: est-ce mieux? sinon, fd pourrait être sur quelque chose. si les deux font aussi bien l'affaire, le code de fd semble plus propre. –

1

Vous trouverez les heures minimales d'enregistrement et de départ pour chaque identifiant d'offre.

select bid, 
(select min(time) from table b where a.bid = b.bid and type = "Check In") as CheckIn, 
(select min(time) from table c where a.bid = c.bid and type = "Check Out") as CheckOut 
from table c 
group by c.bid 
+0

Vous pouvez faire la même chose sans sous-requêtes :) –

+1

On dirait un RBAR caché, s'il vous plaît lire sur: http://www.sqlservercentral.com/articles/T-SQL/61539/ – Brimstedt

+0

Je ne peux pas être dérangé de s'inscrire pour lire le article, mais je reçois le jist! –

0

Je pense que vous cherchez quelque chose comme ceci:

SELECT 
    `bid`, 
    MAX(IF(`type` = 'Check In', `time`, NULL)) AS `CheckIn`, 
    MAX(IF(`type` = 'Check Out', `time`, NULL)) AS `CheckOut` 
FROM `yourtable` 
GROUP BY `bid` 
4

Sur la base de la requête de David, ce qui élimine les offres en double et en limitant par type de contrôle.

SELECT 
    a.bid, min(a.time) checkin, ISNULL(min(b.time), '') checkout 
FROM 
    myTable a 
LEFT JOIN 
    myTable b ON a.bid = b.bid 
WHERE 
    a.type = "Check In" 
    AND 
    b.type = "Check Out" 
GROUP BY 
    a.bid 
ORDER BY 
    a.time 
+0

Notez, je suppose que vous voulez le premier checkin et la caisse, s'il y a des doublons. Cela semble être ce que le tableau des résultats implique. –

+0

Salut merci .. mais ici aussi, il répète les lignes parce que le temps est différent événement la date est la même. Mais je veux afficher seulement une ligne pour la date entière. J'ai essayé de convertir datetime à seule date. Mais il ne fonctionne pas pour moi – Nagu

+0

je me suis converti comme celui-ci ORDER BY ((SELECT CONVERT (VARCHAR (10), a.datetime, 111))) Mais il affiche l'erreur – Nagu